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 如果您不熟悉此处 ::
的用法。
这按预期工作:
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 如果您不熟悉此处 ::
的用法。