其实在ruby里,yield就是实现迭带器的,比如Array里的each什么都是通过这个来实现的。
首先,yield必须和块连用,块就是跟在方法后面的{},可以暂时理解为参数也行。比如:
def test
yield
yield
end
test{p 'test'}
会p两次 test。现在来解释下这个方法的运行:首先调用方法,然后接着到后面的{},但这里不会运行,而直接进入方法里面,也就是执行yield,而yield就是使先前的块执行,也就是{}里的内容,所以p了两次test。
然后这种:
def test
yield(1)
end
test{|i| p i}
yield带参数的,执行的时候就会把参数传递给||中间这个变量,然后执行块。
所以,现在我们来定义Array的each方法就是这样:
def each
for i in 0...size
yield(self)
end
end
最后,block_given?这个可以判断方式是否带块,这样使用:
def test
if block_given?
yield
p 'block'
else
p 'noblock'
end
end
test{}
test