ruby - 为什么 Ruby 精化只修改类,而不修改模块?

标签 ruby refinements

Ruby docs on refinements state :

Refinements only modify classes, not modules so the argument must be a class.

这是为什么?

可以对模块进行猴子修补:

module MyModule
  def my_method
    "hello"
  end
end

include MyModule
puts my_method # => hello

module MyModule
  def my_method
    "goodbye"
  end
end

puts my_method # => goodbye

我敢肯定这不是一个好主意,但如果您可以限制这种猴子补丁的范围,它可能不会那么糟糕。那你为什么不能?

最佳答案

模块的改进与类的改进一样有用。考虑如何

module Foobar
  refine Enumerable
    def all_zero?; all? &:zero? end
  end
end

比直接猴子修补更礼貌:

module Enumerable
  def all_zero?; all? &:zero? end
end

有一个 implementation issue带有精炼模块,seems to be solved by now .

关于ruby - 为什么 Ruby 精化只修改类,而不修改模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33071443/

相关文章:

ruby - 如何将实例变量和 HTTParty 发布到使用 OAuth2 的 API

ruby-on-rails - 如何创建一个规范来验证 Pundit 拒绝未登录的用户?

ruby-on-rails - 使用 RSpec 和 Haml 测试嵌套布局助手

ruby-on-rails - Ruby 改进和钩子(Hook)

Ruby 的精妙之处

ruby - 分层使用优化

ruby-on-rails - 是否有人将 Ruby/Rails 与 Sales Logix 数据库一起使用?

ruby - 为什么带有 initialize() 的 respond_to 返回 false?

ruby - 动态调度是否会降低圈复杂度?