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.