我有一个 ruby 方法需要检查一个块是否传递给它。一位同事建议简单地检查是否block.nil?
在性能上稍快一些,并且适用于命名块。这已经很烦人了,因为他正在使用命名块并使用它来调用它,block.call
而不是yield
已经证明明显更快,因为命名块在可读性方面更容易理解。
版本 1:
def named_block &block
if block.nil?
puts "No block"
else
block.call
end
end
版本 2:
def named_block &block
if !block_given?
puts "No block"
else
block.call
end
end
基准测试显示版本 1 比版本 2 稍快,但是快速查看源代码似乎表明它block_given?
是线程安全的。
这两种方法的主要区别是什么?请帮我证明他错了!