Saya baru mengenal ruby dan saat ini mencoba mengoperasikan setiap karakter secara terpisah dari String dasar di ruby. Saya menggunakan ruby 1.8.6 dan ingin melakukan sesuatu seperti:
"ABCDEFG".each_char do |i|
puts i
end
Ini menghasilkan kesalahan metode `each_char 'yang tidak ditentukan.
Saya mengharapkan untuk melihat hasil vertikal:
A
B
C
D
..etc
Apakah each_char
metode ini hanya ditentukan untuk 1.9? Saya mencoba menggunakan each
metode biasa , tetapi blok hanya menutupi seluruh string dalam satu baris. Satu-satunya cara saya memikirkan bagaimana melakukan ini, yang agak merepotkan adalah dengan membuat serangkaian karakter dari awal:
['A','B','C','D','...'].each do|i|
puts i
end
Ini menghasilkan yang diinginkan:
A
B
C
..etc
Apakah mungkin ada cara untuk mencapai keluaran ini dengan menggunakan string yang tidak dimodifikasi untuk memulai?
Saya pikir padanan Java adalah:
for (int i = 0; i < aString.length(); i++){
char currentChar = aString.charAt(i);
System.out.println(currentChar);
}
Jawaban:
Saya memiliki masalah yang sama. Saya biasanya menggunakan
String#split
:"ABCDEFG".split("").each do |i| puts i end
Saya kira Anda juga bisa menerapkannya sendiri seperti ini:
class String def each_char self.split("").each { |i| yield i } end end
Edit: alternatif lain
String#each_byte
tersedia di Ruby 1.8.6, yang mengembalikan nilai ASCII dari setiap karakter dalam string ASCII:"ABCDEFG".each_byte do |i| puts i.chr # Fixnum#chr converts any number to the ASCII char it represents end
sumber
Memperluas komentar la_f0ka, esp. jika Anda juga membutuhkan posisi indeks dalam kode Anda, Anda harus bisa melakukannya
s = 'ABCDEFG' for pos in 0...s.length puts s[pos].chr end
Itu
.chr
penting karena Ruby <1.9 mengembalikan kode karakter pada posisi itu alih-alih substring dari satu karakter pada posisi itu .sumber
0..s.length - 1
=0...s.length
benar-benar ada masalah di 1.8.6. dan tidak apa-apa setelah edisi ini
di 1.8.6, Anda dapat menambahkan ini:
requre 'jcode'
sumber
Tetapi sekarang Anda dapat melakukan lebih banyak lagi:
a = "cruel world" a.scan(/\w+/) #=> ["cruel", "world"] a.scan(/.../) #=> ["cru", "el ", "wor"] a.scan(/(...)/) #=> [["cru"], ["el "], ["wor"]] a.scan(/(..)(..)/) #=> [["cr", "ue"], ["l ", "wo"]]
sumber
"ABCDEFG".chars.each do |char| puts char end
juga
"ABCDEFG".each_char {|char| p char}
Versi Ruby> 2.5.1
sumber