【问题标题】:Ruby 2.2+, using kind_of?(Class) inside a module extending Hash core class does not workRuby 2.2+,在扩展哈希核心类的模块中使用 kind_of?(Class) 不起作用
【发布时间】:2015-11-05 14:38:57
【问题描述】:

这按预期工作:

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

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

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 类,而是 self.class # => Hash 所以它像 Hash 类一样“嘎嘎”。

【问题讨论】:

    标签: ruby module monkeypatching


    【解决方案1】:

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

    您的代码可以通过引用全局Hash 类来修复:self.kind_of?(::Hash)See this question 如果您不熟悉这里如何使用 ::

    【讨论】:

    • 哈!这是让你感动的小事……我对 :: 很熟悉,但在这里根本没想到。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多