从精简bug到nil的隐式转换

时间:2013-11-22 09:52:57

标签: ruby type-conversion implicit-conversion

我尝试使用精简功能(我使用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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

优化是词法范围的。它们只在您激活它们的脚本,模块声明或类声明中可见。这就是它们的整个目的

在您的情况下,您使用Aer模块声明中的细化,这意味着在该模块声明中,NilClass将具有to_hash方法。但仅在该模块内部。并且在任何其他模块或类中,包括 Hash,其中merge!已定义。