我很神秘。我有以下方法:
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
。
答案 0 :(得分:0)
解决了!
简短的回答是你应该写
# ...
when ::Hash
# ...
而不是
# ...
when Hash
# ...
更长的故事:
事实证明,因为我的方法是在一个继承自Virtus::Attribute
的类中,并且因为有一个Virtus::Attribute::Hash
类,所以我不知不觉地试图将value
与那个野兽进行比较而不是Ruby的拥有本土哈希。