使用Ruby中的“for each”实现“each”函数

3

我一直在学习Ruby,对数组类中的'each'如何实现感兴趣。我看到了这个文档,似乎是这样实现'each'的:

# within class Array...
def each
  for each element
    yield(element)
  end
end

我在ruby控制台中写了上述代码(不包含注释#),我的ruby版本是1.9.2,但遇到了语法错误。

:SyntaxError: (irb):2: syntax error, unexpected tIDENTIFIER, expecting keyword_do or '{' or '('
(irb):5: syntax error, unexpected keyword_end, expecting $end

这是由于不完整的数组类实现引起的吗(即“元素”未定义),还是因为其他原因?我还想知道如何实现“each”和其他基本函数。有关正确文档/答案的任何参考资料都将很有帮助。如果这是重复的问题,请告诉我(我没有看到任何相似的问题)。谢谢。

4个回答

12
你可以这样做(不要忘记 in):
class Array
  def each
    for element in self
      yield element
    end
  end
end

但事实是:

for element in arrayarray.each 的语法糖。

所以上述代码被转换成了这样:

class Array
  def each
    each do |element|
      yield element
    end
  end
end

你也可以在stackoverflow上提问。


7

首先,你的for语句的语法有误,应该像这样:for element in elements,这与elements.each { |element| ... }几乎等价,但它不会引入新的作用域。实际上,for是使用each实现的,当你尝试在没有定义each方法的方法上调用它时,就会看到这一点:

>> for element in nil
..   end
NoMethodError: undefined method `each' for nil:NilClass
    from (irb):1

关于您的语法错误:由于您正在重新打开一个类,因此当Ruby解析器看到独立的each时,它会将self用作接收器,因此将您的语句翻译为for self.each element,其中element是提到的tIDENTIFIER,而self.each do |element| ... end这样的东西则是期望的。
至于Array#each的实现方式,它是用C实现的,代码如下。
VALUE
rb_ary_each(VALUE array)
{
    long i;
    volatile VALUE ary = array;

    RETURN_ENUMERATOR(ary, 0, 0);
    for (i=0; i<RARRAY_LEN(ary); i++) {
        rb_yield(RARRAY_PTR(ary)[i]);
    }
    return ary;
}

这基本上是你试图用C语言写成的Ruby代码。

0

Array#each 是 Ruby 内置的方法,没有被任何 gem 打补丁。请查看 此处 的文档。


0

可以通过循环0到数组大小(不包括)的范围来实现

class Array
  def each
    for i in 0...self.size
      yield self[i]
    end
  end
end

例子:

[1,2,3].each {|i| puts i}
1
2
3

它运行正常!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接