Ruby 2.2+,在扩展哈希核心 class 的模块中使用 kind_of?(Class) 不起作用

Ruby 2.2+, using kind_of?(Class) inside a module extending Hash core class does not work

这按预期工作:

h = { a: "alpha" }
h.kind_of?(Hash) # => true

但是,当我尝试使用模块扩展核心 Ruby class 时,它似乎不起作用:

module CoreExtensions
  module Hash
    module Keys
      def my_custom_method
        self.each do |k, v|
          self.kind_of?(Hash) # => false
        end
      end
    end
  end
end

Hash.include CoreExtensions::Hash::Keys

h = { a: "alpha" }
h.my_custom_method

请注意,这是演示我的问题的人为代码示例。

在这样的模块中使用 object.kind_of?(Class) 有什么不同吗?我的假设是使用 self 是以某种方式引用模块而不是实际的 Hash class,而是 self.class # => Hash 所以它 "quacks" 就像哈希 class.

self.kind_of?(Hash)中的Hash是指CoreExtensions::Hash。如果您想亲眼看看,请尝试 p Hash

您的代码可以通过引用全局 Hash class 而不是:self.kind_of?(::Hash) 来修复。 See this question 如果您不熟悉此处 :: 的用法。