迭代ruby 1.8.6中的字符串的每个字符(each_char)

den*_*chr 84 ruby string iterator

我是ruby的新手,目前正尝试与ruby中的基本字符串分别对每个字符进行操作.我正在使用ruby 1.8.6并想做类似的事情:

"ABCDEFG".each_char do |i|
  puts i
end
Run Code Online (Sandbox Code Playgroud)

这会产生一个未定义的方法`each_char'错误.

我期待看到垂直输出:

A
B
C
D
..etc
Run Code Online (Sandbox Code Playgroud)

each_char方法仅定义为1.9吗?我尝试使用普通each方法,但块只是将整个字符串输出到一行.我想办法如何做到这一点的唯一方法就是从头开始创建一个字符数组:

['A','B','C','D','...'].each do|i|
  puts i
end
Run Code Online (Sandbox Code Playgroud)

这输出所需的:

A
B
C
..etc
Run Code Online (Sandbox Code Playgroud)

是否有一种方法可以使用未修改的字符串开始实现此输出?

我认为Java等价物是:

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

Jer*_*ten 111

我也有同样的问题.我通常求助于String#split:

"ABCDEFG".split("").each do |i|
  puts i
end
Run Code Online (Sandbox Code Playgroud)

我想你也可以自己实现它:

class String
  def each_char
    self.split("").each { |i| yield i }
  end
end
Run Code Online (Sandbox Code Playgroud)

编辑:另一个替代方案是String#each_byte,在Ruby 1.8.6中可用,它返回ASCII字符串中每个字符的ASCII值:

"ABCDEFG".each_byte do |i|
  puts i.chr # Fixnum#chr converts any number to the ASCII char it represents
end
Run Code Online (Sandbox Code Playgroud)

  • 这是永远的,但为什么不再一个......"我在0 ..."ABCDFG'.length-1` ...... (2认同)

ssc*_*rth 14

扩展la_f0ka的评论,尤其是 如果你还需要代码中的索引位置,你应该能够做到

s = 'ABCDEFG'
for pos in 0...s.length
    puts s[pos].chr
end
Run Code Online (Sandbox Code Playgroud)

.chr很重要,因为Ruby <1.9 返回该位置的字符代码,而不是该位置的一个字符的子字符串.

  • `0..s.length - 1` =`0 ... s.length` (4认同)

Jul*_*ian 9

"ABCDEFG".chars.each do |char|
  puts char
end
Run Code Online (Sandbox Code Playgroud)

"ABCDEFG".each_char {|char| p char}
Run Code Online (Sandbox Code Playgroud)

Ruby 版本 >2.5.1