在Ruby 1.8.6中迭代一个字符串的每个字符(each_char)


86

我是ruby的新手,目前尝试与ruby中的基本String分开对每个字符进行操作。我正在使用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);
}

1
“ asfds” .char.each ....
穆罕默德·乌默尔

Answers:


115

我也有同样的问题。我通常会诉诸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

感谢您的有用提示。它工作正常。那么each_char方法的作用是什么?我想换一个新版本?
denchr

直到现在我都没有研究它,但是在谷歌搜索了一下之后,显然它被错误地列在1.8.6文档中,但是直到1.8.7才可用。
杰里米·鲁滕

each_char方法用于较旧的版本,否则该版本不具备此方法。尚未在ruby-doc.org/core/classes/String.html#M000862上记录,我惊讶的是,我看到each_char产生一个字符串,如jeremy的split。
Martin Dorey 2010年


1

1.8.6中确实存在问题。这个版本以后还可以

在1.8.6中,您可以添加以下内容:

requre 'jcode'

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"]]

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

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

Ruby版本> 2.5.1

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.