2015-11-05 5 views
0

Это работает, как ожидалось:рубин 2.2+, используя kind_of (класс) внутри модуля, простирающейся базового класса Hash не работает

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.

ответ

2

Hash в self.kind_of?(Hash) относится к CoreExtensions::Hash. Попробуйте p Hash, если вы хотите сами убедиться.

Ваш код может быть исправлен путем обращения к глобальному классу Hash: self.kind_of?(::Hash). See this question, если вы не знакомы с тем, как здесь используется ::.

+0

Ha! Это мелочи, которые тебя достали ... Я знаком с ::, но даже не думал об этом здесь. Очень признателен. –