我试着对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
方法。但只有在那个模块里面。不在任何其他模块或类中,包括定义了Hash
的merge!
。