Eu sou novo no Ruby e atualmente estou tentando operar cada caractere separadamente de uma String base no Ruby. Estou usando o Ruby 1.8.6 e gostaria de fazer algo como:
"ABCDEFG".each_char do |i|
puts i
end
Isso produz um erro de método indefinido `each_char '.
Eu esperava ver uma saída vertical de:
A
B
C
D
..etc
O each_char
método está definido apenas para 1.9? Tentei usar o each
método simples , mas o bloco simplesmente produz a string inteira em uma linha. A única maneira de descobrir como fazer isso, o que é bastante inconveniente, é criar uma série de personagens desde o início:
['A','B','C','D','...'].each do|i|
puts i
end
Isso resulta no desejado:
A
B
C
..etc
Existe talvez uma maneira de obter essa saída usando uma string não modificada para começar?
Acho que o equivalente em Java é:
for (int i = 0; i < aString.length(); i++){
char currentChar = aString.charAt(i);
System.out.println(currentChar);
}
Respostas:
Eu tenho o mesmo problema. Eu costumo recorrer a
String#split
:"ABCDEFG".split("").each do |i| puts i end
Eu acho que você também pode implementá-lo desta forma:
class String def each_char self.split("").each { |i| yield i } end end
Editar: ainda outra alternativa está
String#each_byte
disponível em Ruby 1.8.6, que retorna o valor ASCII de cada caractere em uma string ASCII:"ABCDEFG".each_byte do |i| puts i.chr # Fixnum#chr converts any number to the ASCII char it represents end
fonte
Estendendo o comentário de la_f0ka, esp. se você também precisa da posição do índice em seu código, você deve ser capaz de fazer
s = 'ABCDEFG' for pos in 0...s.length puts s[pos].chr end
O
.chr
é importante porque Ruby <1.9 retorna o código do caractere naquela posição em vez de uma substring de um caractere naquela posição .fonte
0..s.length - 1
=0...s.length
realmente há um problema em 1.8.6. e está tudo bem após esta edição
em 1.8.6, você pode adicionar este:
requre 'jcode'
fonte
Mas agora você pode fazer muito mais:
a = "cruel world" a.scan(/\w+/) #=> ["cruel", "world"] a.scan(/.../) #=> ["cru", "el ", "wor"] a.scan(/(...)/) #=> [["cru"], ["el "], ["wor"]] a.scan(/(..)(..)/) #=> [["cr", "ue"], ["l ", "wo"]]
fonte
"ABCDEFG".chars.each do |char| puts char end
Além disso
"ABCDEFG".each_char {|char| p char}
Versão Ruby> 2.5.1
fonte