【问题标题】:iterating over each character of a String in ruby 1.8.6 (each_char)在 ruby​​ 1.8.6 (each_char) 中迭代字符串的每个字符
【发布时间】:2010-12-01 21:07:43
【问题描述】:

我是 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);
}

【问题讨论】:

  • "asfds".char.each....

标签: ruby string iterator


【解决方案1】:

我也有同样的问题。我通常诉诸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 方法是做什么用的呢?我想只是为了更新版本?
  • 我直到现在才调查它,但是在谷歌搜索了一下之后,显然它被错误地列在了 1.8.6 文档中,但直到 1.8.7 才可用。
  • each_char 方法适用于 older 版本,否则没有它。尚未在 ruby-doc.org/core/classes/String.html#M000862 记录,令我惊讶的是,我看到 each_char 产生一个字符串,就像 jeremy 的 split。
【解决方案2】:

扩展 la_f0ka 的评论,特别是。如果您还需要代码中的索引位置,您应该可以这样做

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

.chr 很重要,因为 Ruby returns the code of the character at that position 而不是 a substring of one character at that position

【讨论】:

  • 0..s.length - 1 = 0...s.length
  • 感谢@MatthewRock,已更改。
【解决方案3】:
"ABCDEFG".chars.each do |char|
  puts char
end

还有

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

Ruby 版本 >2.5.1

【讨论】:

    【解决方案4】:

    1.8.6确实有问题。 过了这个版本就好了

    在 1.8.6 中,你可以添加这个:

    requre 'jcode'
    

    【讨论】:

      【解决方案5】:

      但现在你可以做的更多:

      a = "cruel world"
      
      a.scan(/\w+/)        #=> ["cruel", "world"]
      
      a.scan(/.../)        #=> ["cru", "el ", "wor"]
      
      a.scan(/(...)/)      #=> [["cru"], ["el "], ["wor"]]
      
      a.scan(/(..)(..)/)   #=> [["cr", "ue"], ["l ", "wo"]]
      

      【讨论】:

        【解决方案6】:

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

        来自ruby-doc.org

        现在你也可以做 string.chars

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-07
          • 2019-08-09
          • 1970-01-01
          • 1970-01-01
          • 2013-12-11
          • 2012-10-23
          • 2011-06-03
          相关资源
          最近更新 更多