(1)根据约定,单行block用大括号包围,多行block用do...end包围
(2)block放在方法调用的参数之后:方法名 + (参数) + block
(3)在方法中,可以使用yield
调用block中的代码。执行完后再返回方法中,执行yield
的下一行。block和方法可以想象成协同例程,它们之间来回转换控制权。
(4)yield
可以带参数调用,block的形参用竖线包围,yield('hello',99)
,{|str, num| ...}
例如:
def call_block
puts 'begin method'
yield
yield
puts 'end method'
end
call_block {puts 'in the block'}
输出:
begin method
in the block
in the block
end method
例如:
animals=%w{ant bee cat dog}
animals.each {|animal| puts animal}
输出:
ant
bee
cat
dog
其中each方法的伪代码定义如下:
#在Array类中
def each
for each element #无效的伪代码
yield(element)
end
end