Ruby 为什么我的杂烩不是杂烩?

Ruby 为什么我的杂烩不是杂烩?,ruby,jruby,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

我很困惑。我有以下方法:

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}(哈希)不能强制转换为货币[false,false](ArgumentError)

怎么了?我最初的怀疑被证明是错误的,那就是代码中的某个地方,一个库调用了
,访问权限不受影响
,结果导致了一些看起来像但不是完全散列的东西。但是对
#的返回值调用
#class
,使用"淡漠"访问
会导致
ActiveSupport::HashWithInferenceAccess
解决了这个问题

简单的回答是你应该写

# ...
when ::Hash
# ...
而不是

# ...
when Hash
# ...
长话短说:


事实证明,由于我的方法位于继承自
Virtus::Attribute
的类中,并且因为存在
Virtus::Attribute::Hash
类,所以我无意中试图将
与该beast进行比较,而不是与Ruby自己的本机Hash进行比较。

您能添加一个吗?我不知道如何在没有重复失败测试的情况下帮助你,这很奇怪。但是我们肯定没有足够的信息来调试这个。MCVE将有所帮助。在这一点上,我结束了对不可复制性的投票。
Hash===value
如果你想用
===
测试它,而不是用另一种方法around@VictorMorozmtm:肯定还有别的事情发生了。应该发布一个更好的问题,特别是如果你回答自己。。。在这个问题上,没有所谓的
Virtus
@kares我一点也不理解你的否决票。显然,如果我一开始就知道答案的话,我可以用一种容易回答的方式来提问,但那样的话,我就不需要一开始就提问了!其他人可能会发现自己处于相同的情况下,模块中有一个常量,或者类中有一个顶级常量,这可能会让人非常困惑,特别是如果他们自己不是该类或模块的作者的话。希望我的回答能为他们提供线索。