在课堂上产生<<自我在课堂上的方法

我想创建一个类方法,它接受一个方法定义块并将其注入到类中。 现在, self确实是Tom对象,所以class << self这个class << self确实打开它,但是yield似乎不起作用。 我的理论知识不是很深,所以我不确定为什么这不起作用。 我可能会完全错误,所以请随意讨论替代方案。

 class Tom < Person mega_methods do def hiya! puts 'hiYA!' end end end class Person def self.mega_methods ... class << self yield end end end Tom.hiya! 

我知道我可以使用class << self来定义Tom的方法,或者我可以在块中包含class << self

我也想出了这个替代方案:

 def self.mega_methods &block if block_given? extension = Module.new(&Proc.new) self.extend(extension) end end 

这个问题更多的是帮助我理解Ruby的工作而不是解决特定的问题。

这有点奇怪,但如果你正在探索Ruby,那就没关系。

 class Person puts "evaluating Person's body ..." def self.mega_methods puts 'in Person#self.mega_methods, about to yield ...' yield end end class Tom < Person puts "evaluating Tom's body ..." print 'Tom.singleton_methods : '; p Tom.singleton_methods mega_methods do puts 'in Tom, about to define self.hiya!' def self.hiya! puts 'hiYA!' end end print 'Tom.singleton_methods : '; p Tom.singleton_methods end Tom.hiya! 

执行:

 $ ruby -w t.rb evaluating Person's body ... evaluating Tom's body ... Tom.singleton_methods : ["mega_methods"] in Person#self.mega_methods, about to yield ... in Tom, about to define self.hiya! Tom.singleton_methods : ["mega_methods", "hiya!"] hiYA! 

请注意,按照惯例,方法名称中的感叹号保留用于销毁方法,例如String#sub! 它修改了接收器字符串。

另请参见def`self.function`名称的含义是什么?

一切都与自我有关!

 class Person2 def self.mega_methods print 'in Person2 self='; p self class << self print 'in class << self self='; p self yield end end end class Tom2 < Person2 mega_methods do puts "in Tom2, about to define self.hiya! for self=#{self}" def self.hiya! puts 'hiYA!' end def hi puts 'hi' end end end print 'Tom2.singleton_methods : '; p Tom2.singleton_methods print 'Tom2.instance_methods : '; p Tom2.instance_methods(false) Tom2.hiya! Tom2.new.hi 

执行:

 $ ruby -w t2.rb in Person2 self=Tom2 in class << self self=# in Tom2, about to define self.hiya! for self=Tom2 Tom2.singleton_methods : ["mega_methods", "hiya!"] Tom2.instance_methods : ["hi"] hiYA! hi