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