执行方法
method execution
调用方法时,Ruby要做两件事:首先找到这个方法,然后执行这个方法。到目前为止,我们只学会了如何找到这个方法,接下来看看如何执行方法。
假设我们自己就是Ruby解释器,现在调用了一个名叫my_method的方法,我们先找到方法,发现该方法定义如下:
def my_method
temp = @x + 1
my_other_method(temp)
end
为了执行这个方法,需要知道两个地方。 首先,实例变量@x属于那个对象?其次,应该在那个对象上调用方法my_other_method?
我们凭直觉就能知道:@x实例变量和 my_other_method方法都属于接受者----那个最初调用,my_method方法的对象。 不过, Ruby可没有那么强的直觉。调用方法时,Ruby需要持有一个接收者的引用,正式由于这个引用,Ruby才知道那个是接收者,再用它来执行这个方法。
self关键字
Ruby的每一行代码都会在一个对象中被执行------这个对象就是所谓的当前对象。当前对象也可以用self表示,因为可以用self关键字来对它进行访问。
任何时刻,只有一个对象能充当当前对象,而且没有那个对象能够长期充当这个角色。调用一个方法时,接收者就成为self。从这一刻起所有的实例变量都是self 的实例变量,所有没有明确指明接收者的方法都在self上调用。一旦代码转而调用其他对象的方法,这个对象就成为了self。
class MyClass
def testing_self
@var = 10 #self的一个实例变量
my_method() #与self.my_method()相同
self
end
def my_method
@var = @var + 1
end
end
obj = MyClass.new
obj.testing_self # => #<MyClass:0x007f93ab08a728 @var=11>
调用testing_self方法时,接收者obj就成为self。因此,实例变量@var就是obj 的实例变量,而且my_method方法也在obj上被调用。在my_method方法执行期间,self还是obj,因此@var还是obj对象的实例变量。最后,testing_self方法返回self的引用(@var=11)