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

为什么to_proc不在Ruby优化中工作?

发布时间:2020-12-17 03:10:19 所属栏目:百科 来源:网络整理
导读:似乎to_proc不适用于优化中定义的方法: module ArrayExtensions refine Array do def sum reduce(0,:+) end endendusing ArrayExtensionsputs [[1,2,3]].map { |array| array.sum } # = 6puts [[1,3]].map(:sum) # = array.rb:13:in `map': undefined metho
似乎to_proc不适用于优化中定义的方法:

module ArrayExtensions
  refine Array do
    def sum
      reduce(0,:+)
    end
  end
end

using ArrayExtensions

puts [[1,2,3]].map { |array| array.sum } # => 6
puts [[1,3]].map(&:sum) # => array.rb:13:in `map': undefined method `sum' for [1,3]:Array (NoMethodError)
puts [1,3].method(:sum).to_proc.call # => array.rb:14:in `method': undefined method `sum' for class `Array' (NameError)

这是预期的行为吗?有解决方法吗?

解决方法

注意以下答案对于传统ruby是正确的.在Ruby 2.5中,map(&:sum)按预期工作.

Scoping of refinements仅限于当前上下文.由于改进意图不是全局的,因此与猴子补丁相反,任何尝试从外部调用精炼方法都会被阻止.在下面的代码中:

puts [[1,3]].map { |array| array.sum } # => 6

范围很好,我们在定义此细化的同一范围内.但在这里:

puts [[1,3]].map(&:sum)

范围被转移到Symbol类(!)的上下文中.如文档中所述:

When control is transferred outside the scope the refinement is deactivated.

这里的比喻是私人方法.尽管如此,虽然它完全与文档中所述,但我不确定这种行为是否有意.我相信,口译员应该照顾这些案件.但这个问题更适合解决Matz

(编辑:李大同)

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

    推荐文章
      热点阅读