有人可以解释以下行为吗?
def a_method
"a_method() was called by #{self}"
end
class MyClass
puts a_method
def another_method
puts a_method
end
end
MyClass.new.another_method
它产生以下输出:
a_method() was called by MyClass
a_method() was called by #<MyClass:0x000000034962b0>
puts a_method
机构中的MyClass
如何运作?如何在定义a_method
时访问Myclass
?
答案 0 :(得分:2)
(Outermost)Ruby语句按照它们的编写顺序调用和执行。
在MyClass
内,有一个方法调用puts a_method
,其中self
是类MyClass
。这将打印输出的第一行。然后,稍后会有一个方法调用another_method
,调用puts a_method
,其中self
是MyClass
的实例。这将打印输出的第二行。
在定义Myclass时如何访问
a_method
?
这似乎暗示您在关闭(第一次出现)类主体时要考虑完成类定义。然而情况并非如此。第一次打开类主体后立即创建一个类。因此,在类体中,您可以在类上调用方法。在类体中定义方法不是创建类的一部分;该类已经存在,它正在修改该类。
答案 1 :(得分:1)
第一个调用在Class范围内执行。因此,自我是阶级。第二个是在类的实例范围内执行的。您可以添加一个类方法,以获得与第一个方法调用相同的效果。
def a_method
"a_method() was called by #{self}"
end
class MyClass
puts a_method # how this works?
def another_method
puts a_method
end
def self.a_class_method
puts a_method
end
end
MyClass.a_class_method
MyClass.new.another_method
# result
a_method() was called by MyClass
a_method() was called by MyClass
a_method() was called by #<MyClass:0x00000002dc49f0>
答案 2 :(得分:1)
一个类体在最初加载时执行(全局变量,类变量和常量在其中定义,最后定义方法)。
a_method
在定义时MyClass
调用。