lặp qua từng ký tự của một chuỗi trong ruby ​​1.8.6 (each_char)


86

Tôi mới làm quen với ruby ​​và hiện đang cố gắng vận hành trên từng ký tự riêng biệt với một Chuỗi cơ sở trong ruby. Tôi đang sử dụng ruby ​​1.8.6 và muốn làm điều gì đó như:

"ABCDEFG".each_char do |i|
  puts i
end

Điều này tạo ra lỗi phương thức không xác định ʻeach_char '.

Tôi đã mong đợi để xem kết quả dọc của:

A
B
C
D
..etc

each_charphương pháp xác định chỉ cho 1.9? Tôi đã thử sử dụng eachphương pháp đơn giản , nhưng khối chỉ xuất hiện toàn bộ chuỗi trong một dòng. Cách duy nhất tôi tìm cách thực hiện việc này, điều này khá bất tiện là tạo một mảng ký tự từ đầu:

['A','B','C','D','...'].each do|i|
  puts i
end

Điều này xuất ra mong muốn:

A
B
C
..etc

Có lẽ có cách nào để đạt được đầu ra này bằng cách sử dụng một chuỗi không sửa đổi để bắt đầu?

Tôi nghĩ rằng Java tương đương là:

for (int i = 0; i < aString.length(); i++){
  char currentChar = aString.charAt(i);
  System.out.println(currentChar);
}

1
"asfds" .char.each ....
Muhammad Umer,

Câu trả lời:


115

Tôi có cùng một vấn đề. Tôi thường dùng đến String#split:

"ABCDEFG".split("").each do |i|
  puts i
end

Tôi đoán bạn cũng có thể tự thực hiện nó như thế này:

class String
  def each_char
    self.split("").each { |i| yield i }
  end
end

Chỉnh sửa: một giải pháp thay thế khác String#each_byte, có sẵn trong Ruby 1.8.6, trả về giá trị ASCII của mỗi char trong một chuỗi ASCII:

"ABCDEFG".each_byte do |i|
  puts i.chr # Fixnum#chr converts any number to the ASCII char it represents
end

Cảm ơn vì lời khuyên hữu ích. Nó hoạt động tốt. Vậy phương thức each_char dùng để làm gì? Tôi chỉ cho phiên bản mới hơn?
denchr 28/09/09

Tôi chưa xem xét nó cho đến bây giờ, nhưng sau khi Googling một chút, rõ ràng nó được liệt kê nhầm trong tài liệu 1.8.6 nhưng không có sẵn cho đến 1.8.7.
Jeremy Ruten 28/09/09

Phương thức each_char dành cho phiên bản cũ hơn , không có nó. Chưa được ghi lại tại ruby-doc.org/core/classes/String.html#M000862 và thật ngạc nhiên, tôi thấy rằng mỗi_char tạo ra một chuỗi, giống như sự phân tách của jeremy.
Martin Dorey


1

thực sự có vấn đề trong 1.8.6. và nó ổn sau ấn bản này

trong 1.8.6, bạn có thể thêm điều này:

requre 'jcode'

1

Nhưng bây giờ bạn có thể làm được nhiều hơn thế:

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

cũng thế

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

Phiên bản Ruby> 2.5.1

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.