加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby – 检查block_given之间有什么区别?和!block.nil?

发布时间:2020-12-17 04:14:22 所属栏目:百科 来源:网络整理
导读:我有一个 ruby方法需要检查块是否传递给它. 一位同事建议只检查是否有block.nil?性能略快,适用于命名块.这已经非常烦人,因为他正在使用命名块并使用block.call调用它而不是已经显示为 significantly faster的yield,因为命名块在可读性方面更容易理解. 版本1
我有一个 ruby方法需要检查块是否传递给它.
一位同事建议只检查是否有block.nil?性能略快,适用于命名块.这已经非常烦人,因为他正在使用命名块并使用block.call调用它而不是已经显示为 significantly faster的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略快,但快速查看source code似乎表明block_given?是线程安全的.

这两种方法有哪些主要区别?请帮我证明他错了!

解决方法

首先,虽然一个零?检查可能比block_given更快?,捕获块很慢.因此,除非您要捕获它,否则性能参数无效.

其次,它更容易理解.每当你看到block_given?时,你就知道究竟是什么了.当你有x.nil?时,你必须停下来想想x是什么.

第三,这是一个习语.根据我的经验,绝大多数Ruby开发人员更喜欢block_given?.在罗马的时候…

最后,您可以保持一致.如果你总是使用block_given?问题解决了.如果你使用nil?检查,你必须捕获块.

>存在性能开销.>它更冗长,是Rubyists试图避免的.>命名事物是编程中最困难的事情之一. :)你能想到一个好名字块Enumerable #map会得到例如吗?>“Grepability”是代码库的理想特征.如果你想找到你检查是否有块的所有地方,那么做什么?检查可能很难.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读