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

时间:2009-09-28 00:48:33

标签: ruby string iterator

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

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

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

我期待看到垂直输出:

A
B
C
D
..etc

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

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

输出所需的:

A
B
C
..etc

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

我认为Java等价物是:

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

6 个答案:

答案 0 :(得分:109)

我有同样的问题。我通常诉诸String#split

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

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

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

编辑:另一个替代方案是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

答案 1 :(得分:12)

扩展la_f0ka的评论,尤其是如果您还需要代码中的索引位置,那么您应该可以

s = 'ABCDEFG'
for pos in 0...s.length
    puts s[pos].chr
end

.chr非常重要,因为Ruby&lt; 1.9 returns the code of the character at that position代替a substring of one character at that position

答案 2 :(得分:1)

1.8.6确实存在问题。 这个版本之后没关系

1.8.6中的

,您可以添加:

requre 'jcode'

答案 3 :(得分:1)

但现在你可以做得更多:

a = "cruel world"

a.scan(/\w+/)        #=> ["cruel", "world"]

a.scan(/.../)        #=> ["cru", "el ", "wor"]

a.scan(/(...)/)      #=> [["cru"], ["el "], ["wor"]]

a.scan(/(..)(..)/)   #=> [["cr", "ue"], ["l ", "wo"]]

答案 4 :(得分:1)

"ABCDEFG".chars.each do |char|
  puts char
end

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

Ruby版本> 2.5.1

答案 5 :(得分:1)

返回 str 中的字符数组。这是 str.each_char.to_a 的简写。如果给出了一个不推荐使用的块,则与 each_char 的作用相同。

来自ruby-doc.org

现在你也可以做 string.chars