2011-12-14 27 views
3

我一直在学习ruby,并且有兴趣知道'each'是如何在数组类中实现的。我看到一个documentation here,看起来这就是'每个'的写法;“每个”的功能实现使用“每个”红宝石

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

我正好写在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 

这是发生由于不完整的数组类实现(即'元素'没有定义,或者是因为其他原因?我也想知道'每个'和其他基本功能是如何实现的,任何对正确文档/回答的引用都会有帮助。让我知道如果这是一个重复(我没有看到任何类似的问题)。谢谢

回答

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 

关于你的语法错误:因为你是重开一个班,当红宝石解析器看到独立的each它使用self作为接收器,因此它会将您的语句翻译为for self.each element,其中elementtIDENTIFIER提到的,而像self.each do |element| ... end这样的东西是预期的。

至于Array#each的实现,它在C'S实现的,看起来像这样

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; 
} 

这基本上是你试图用Ruby用C编写

11

你可以这样做什么(唐”牛逼错过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 

你计算器。

0

Array#each是用Ruby构建的方法。它没有修补任何宝石。通过遍历范围从0到阵列的大小看到的文档here

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 

它的工作原理!