ruby - 为什么 to_proc 在 Ruby 改进中不起作用?

标签 ruby proc refinements

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, 2, 3]].map(&:sum) # => array.rb:13:in `map': undefined method `sum' for [1, 2, 3]:Array (NoMethodError)
puts [1, 2, 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, 2, 3]].map { |array| array.sum } # => 6

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

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

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

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

这里的类比是私有(private)方法。虽然,虽然它与文档中所述完全相同,但我不确定这种行为是否有意为之。我认为,口译员应该注意这种情况。但是这个问题最好解决 Matz :)

附言好问题!

关于ruby - 为什么 to_proc 在 Ruby 改进中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35333222/

相关文章:

python - Python 有类似 Ruby 的 Fog 的东西吗?

javascript - 在js文件内的ruby行中使用JS var

ruby - Ruby 中的哈希语法

linux - "/proc/$pid/latency"文件有什么作用?

ruby - 在 rspec 上下文中解释 procs 的用法

ruby-on-rails - 通过虚拟属性选择 Rails 模型

linux - 执行进程 n 个 cpu 周期

haskell - 如何从具有类型相等约束的 Scott 编码的 GADT 中获取值?

Ruby 的精妙之处