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.