为什么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类(!)的上下文中.如文档中所述:
这里的比喻是私人方法.尽管如此,虽然它完全与文档中所述,但我不确定这种行为是否有意.我相信,口译员应该照顾这些案件.但这个问题更适合解决Matz (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |