我尝试使用精简功能(我使用ruby 2.1.0)
进行了一些修改目的是将隐式转换(to_hash)重定向到显式转换并避免此错误:
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 }
当我使用精炼功能时,我得到一个无方法错误。
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
我该如何解决这个问题?
答案 0 :(得分:1)
优化是词法范围的。它们只在您激活它们的脚本,模块声明或类声明中可见。这就是它们的整个目的。
在您的情况下,您使用Aer
模块声明中的细化,这意味着在该模块声明中,NilClass
将具有to_hash
方法。但仅在该模块内部。并且不在任何其他模块或类中,包括 Hash
,其中merge!
已定义。