iterasi atas setiap karakter String di ruby ​​1.8.6 (each_char)

86

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_charmetode ini hanya ditentukan untuk 1.9? Saya mencoba menggunakan eachmetode 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);
}
denchr
sumber
1
"asfds" .char.each ....
Muhammad Umer

Jawaban:

115

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_bytetersedia 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
Jeremy Ruten
sumber
Terima kasih atas tip yang sangat membantu. Ini bekerja dengan baik. Jadi untuk apa metode each_char digunakan? Hanya untuk versi yang lebih baru, ya?
denchr
Saya belum memeriksanya sampai sekarang, tetapi setelah Googling sedikit, tampaknya itu secara keliru terdaftar di dokumen 1.8.6 tetapi tidak tersedia hingga 1.8.7.
Jeremy Ruten
Metode each_char adalah untuk versi lama , yang sebaliknya tidak memilikinya. Belum didokumentasikan di ruby-doc.org/core/classes/String.html#M000862 dan yang mengejutkan saya, saya melihat bahwa each_char menghasilkan string, seperti jeremy's split.
Martin Dorey
15

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 .chrpenting karena Ruby <1.9 mengembalikan kode karakter pada posisi itu alih-alih substring dari satu karakter pada posisi itu .

sschuberth.dll
sumber
5
0..s.length - 1=0...s.length
MatthewRock
Terima kasih @MatthewRock, berubah.
sschuberth
1

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'
kaka2008
sumber
1

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"]]
GB
sumber
1
"ABCDEFG".chars.each do |char|
  puts char
end

juga

"ABCDEFG".each_char {|char| p char}

Versi Ruby> 2.5.1

Julian
sumber