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);
}

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

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


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'

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"]]

1
"ABCDEFG".chars.each do |char|
  puts char
end

juga

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

Versi Ruby> 2.5.1

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.