块是 ruby 中相当基本的部分。它们由do |arg0,arg1| ... end 或{ |arg0,arg1,arg2| ... } 分隔。
它们允许您指定要传递给方法的回调。
可以通过两种方式调用此回调 - 通过捕获
通过指定以& 为前缀的最终参数,或者通过
使用yield 关键字:
irb> def meth_captures(arg, &block)
block.call( arg, 0 ) + block.call( arg.reverse , 1 )
end
#=> nil
irb> meth_captures('pony') do |word, num|
puts "in callback! word = #{word.inspect}, num = #{num.inspect}"
word + num.to_s
end
in callback! word = "pony" num = 0
in callback! word = "ynop" num = 1
#=> "pony0ynop1"
irb> def meth_yields(arg)
yield(arg, 0) + yield(arg.upcase, 1)
end
#=> nil
irb> meth_yields('frog') do |word, num|
puts "in callback! word = #{word.inspect}, num = #{num.inspect}"
word + num.to_s
end
in callback! word = "frog", num = 0
in callback! word = "FROG", num = 1
#=> "frog0FROG1"
请注意,我们的回调在每种情况下都是相同的 - 我们可以删除
通过将我们的回调保存在一个对象中,然后将其传递给每个对象来重复
方法。这可以使用lambda 来捕获对象中的回调来完成,
然后通过前缀&传递给一个方法。
irb> callback = lambda do |word, num|
puts "in callback! word = #{word.inspect}, num = #{num.inspect}"
word + num.to_s
end
#=> #<Proc:0x0052e3d8@(irb):22>
irb> meth_captures('unicorn', &callback)
in callback! word = "unicorn", num = 0
in callback! word = "nrocinu", num = 1
#=> "unicorn0nrocinu1"
irb> meth_yields('plate', &callback)
in callback! word = "plate", num = 0
in callback! word = "PLATE", num = 1
#=> "plate0PLATE1"
在这里了解& 作为函数最后一个参数的前缀的不同用途很重要
- 在函数定义中,它将任何传递的块捕获到该对象中
- 在函数调用中,它将给定的回调对象扩展为一个块
如果你环顾四周,到处都在使用块,尤其是在迭代器中,比如Array#each。