Вопреки тому, что говорится в книге, она работает без Kernel.send
, вам просто нужен контекст, в котором класс для self
включает Kernel
- что почти всегда так.
например, если вы сделаете это в основной области видимости, это будет там:
irb(main):024:0> self.class.ancestors
=> [Object, Kernel, BasicObject]
Итак, используя
define_method :counter do
shared
end
отлично работает.
Вам нужен только этот трюк, если в текущем контексте Kernel
не включен, например если вы находитесь внутри простого BasicObject
или какого-то созданного пользователем класса-потомка.