2015-10-06 121 views
1

我正在通过一个简单的教程each vs for循环在Ruby中的方式。这应该是一个简单的例子,但由于某种原因,我不理解yield语句和for循环之间的交互。红宝石量和For循环

class MyEachThing 
    def each 
    yield 1 
    yield 42 
    yield 2 
    yield 42 
    yield 3 
    end 
end 

for i in MyEachThing.new 
    p i 
end 
# >> 1 
# >> 42 
# >> 2 
# >> 42 
# >> 3 

产量,我由接下来的例子对我来说很有意义:

def calling 
    p yield(45) 
end 

calling {|i| i*2} 

我只是不明白第一个例子是如何工作的。感谢您的帮助。

回答

2
for i in MyEachThing.new 
    p i 
end 

是类似于:

MyEachThing.new.each do |i| 
    p i 
end 

,这意味着,要调用上MyEachThing实例each方法并传递i到该块。

并且,yield相当于:block.call表示您正在调用带有参数传递的块(本例中为i)。

yield i相当于:block.call(i)而您的区块只是打印i的值。

+0

@K明白了!谢谢。在这种情况下'for'方法在语法上似乎很奇怪。 'each'方法对我来说更有意义。 – inthenameofmusik

+1

是的,使用'each'是比较好用的,因为它比较习惯。看到这篇文章的一些更有趣的信息:http://stackoverflow.com/questions/3294509/for-vs-each-in-ruby –

+0

表达式不是很“等效”。如果在每个'end'后添加'pi',则在使用'for'时会打印'i'的最后一个值,而当使用'each'时会引发异常:'NameError:未定义的局部变量或方法'i'对于main:Object' .... –