为什么我的哈希不是哈希?

时间:2014-06-25 10:22:50

标签: ruby jruby

我很神秘。我有以下方法:

def coerce(value)
  case value
  when Hash
    from_hash(value)
  when Money
    value
  else
    fail ArgumentError.new "#{value.inspect} (#{value.class}) cannot be coerced into Money [ #{value === Hash}, #{value.class == Hash} ]"
  end
end

调用时(我的应用程序深处),它会失败并显示以下消息: {:currency=>"DKK", :amount=>1000} (Hash) cannot be coerced into Money [ false, false ] (ArgumentError)

怎么了?我最初的怀疑结果是错误的,就是代码中的某个地方,一个库正在调用#with_indifferent_access,导致看起来像是哈希的东西。但是,在#class的返回值上调用#with_indifferent_access会产生ActiveSupport::HashWithIndifferentAccess

1 个答案:

答案 0 :(得分:0)

解决了!

简短的回答是你应该写

# ...
when ::Hash
# ...

而不是

# ...
when Hash
# ...

更长的故事:

事实证明,因为我的方法是在一个继承自Virtus::Attribute的类中,并且因为有一个Virtus::Attribute::Hash类,所以我不知不觉地试图将value与那个野兽进行比较而不是Ruby的拥有本土哈希。