Ruby initialize 中的self
“元编程”动态方法一章, 有这么一个例子(摘了其中一部分):
class MyClass
def initialize
MyClass.class_func
end
def self.class_func
define_method(:hello) do |param|
p param
end
end
end
obj = MyClass.new
obj.hello("hh")
注意第三行, 这样有一个硬编码的 MyClass
, 于是想消除它.
首先换成了 self.class_func
, 运行一下报方法找不到.
开始还以为是加载顺序的问题, 后来意识到是 self
用错了.
正确的写法是 self.class.class_func
.
class MyClass
def initialize
p "init start>>"
self.class.class_func
p "self at init: ", self
p "init end>>"
end
def self.class_func
p "define self.class_func>>"
define_method(:hello) do |param|
p param
end
end
end
obj = MyClass.new
obj.hello("hh")
p obj
p MyClass.new
该程序的结果如下:
"init start>>"
"define self.class_func>>"
"self at init: "
#<MyClass:0x007f98bb1847b8>
"init end>>"
"hh"
#<MyClass:0x007f98bb1847b8>
"init start>>"
"define self.class_func>>"
"self at init: "
#<MyClass:0x007f98bb1841a0>
"init end>>"
#<MyClass:0x007f98bb1841a0>
结论:
initialize 中的 self 即 MyClass.new 的对象.
在 initialize 中调用类方法应该使用 self.class.class_method