2015-10-06 60 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' .... –