Ruby 1.8.6'da bir String'in her karakteri üzerinde yineleme (each_char)


86

Ruby'de yeniyim ve şu anda Ruby'deki bir temel String'den her karakter üzerinde ayrı ayrı işlem yapmaya çalışıyorum. Ruby 1.8.6 kullanıyorum ve şöyle bir şey yapmak istiyorum:

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

Bu, tanımlanmamış bir yöntem olan "each_char" hatası üretir.

Aşağıdakilerin dikey çıktısını görmeyi bekliyordum:

A
B
C
D
..etc

Mi each_charyöntem yalnızca 1.9 için tanımlandığı? Düz eachyöntemi kullanmayı denedim , ancak blok tüm dizeyi tek bir satırda çıkarıyor. Bunu nasıl yapacağımı anlamamın tek yolu, ki bu oldukça zahmetli, başlangıçtan itibaren bir karakter dizisi oluşturmak:

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

Bu istenen çıktıyı verir:

A
B
C
..etc

Başlamak için değiştirilmemiş bir dizge kullanarak bu çıktıyı elde etmenin bir yolu olabilir mi?

Bence Java eşdeğeri:

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

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

Yanıtlar:


115

Bende de aynı sorun var. Genellikle şunlara başvururum String#split:

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

Sanırım bunu kendiniz de uygulayabilirsiniz:

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

Düzenleme:String#each_byte Ruby 1.8.6'da bulunan ve bir ASCII dizesindeki her bir karakterin ASCII değerini döndüren başka bir alternatif daha vardır:

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

Yararlı ipucu için teşekkürler. İyi çalışıyor. Peki, each_char yöntemi ne için kullanılır? Sanırım sadece yeni sürüm için?
denchr

Şimdiye kadar araştırmadım, ancak biraz Googling'den sonra, görünüşe göre yanlışlıkla 1.8.6 belgelerinde listeleniyor ancak 1.8.7'ye kadar mevcut değil.
Jeremy Ruten

Each_char yöntemi, başka türlü sahip olmayan eski sürüm içindir. Henüz ruby-doc.org/core/classes/String.html#M000862 adresinde belgelenmedi ve şaşırtıcı bir şekilde, each_char'ın jeremy'nin bölünmesi gibi bir dizge verdiğini görüyorum.
Martin Dorey


1

1.8.6'da gerçekten bir sorun var. ve bu baskıdan sonra sorun yok

1.8.6'da şunu ekleyebilirsiniz:

requre 'jcode'

1

Ama şimdi çok daha fazlasını yapabilirsiniz:

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

Ayrıca

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

Ruby sürümü> 2.5.1

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.