我试着对refine特性做了一些修改(我使用ruby 2.1.0)
目的是将隐式转换(到哈希)重定向到显式转换并避免此错误:

data = {test: :t}.merge!(nil)
# Return TypeError: no implicit conversion of nil into Hash

当我重新打开NilClass时,一切正常:
class NilClass
 def to_hash
   to_h
 end
end
data = {test: :t}.merge!(nil)
# { :test => :t }

当我使用refine特性时,我得到一个无方法错误。
module MyRefine
  module NilClass
    refine ::NilClass do
      def to_hash
        selt.to_h
      end
    end
  end
end

module Aer
  using MyRefine::NilClass
  data = {test: :t}.merge!(nil)
  puts data
end
# NoMethodError: super: no superclass method `to_hash' for nil:NilClass

我怎样才能解决这个问题?

最佳答案

细化是词汇范围。它们只在脚本、模块声明或在中激活它们的类声明中可见。这就是他们的全部目的。
在您的例子中,您使用Aer模块声明内部的精化,这意味着在该模块声明内部,NilClass将有一个to_hash方法。但只有在那个模块里面。不在任何其他模块或类中,包括定义了Hashmerge!

10-07 15:18