在实例方法中, 可以用 self
这个特殊的变量来引用方法的接收者. 接下来我们看看其他实例方法如何调用 name
方法.
class HelloWorld
attr_accessor :name
def initialize(name = "Ruby")
@name = name
end
def greet
puts "Hi, I am #{self.name}."
end
end
greet 方法中的 self.name
引用了调用 greet
方法时的接收者.
调用方法时, 如果省略的接收者, Ruby 就会默认把 self
作为该方法的接收者. 因此, 即使省略了 self, 也还是可以调用 name 方法. 如下所示:
def greet
puts "Hi, I am #{name}"
end
另外, 在调用 name=
这样的以 =
结束的方法时, 有一点需要特别注意.
在实例方法中定义 name = "Ruby" 这样的定义, 如果仅在方法内部定义名为name的局部变量, Ruby不会以缺省接收者的方式调用 name= 方法. 这种情况下 我们需要用 self.name = "Ruby" 的形式来显式的调用 name=方法.
def test_name
name = "Ruby" # 局部变量
self.name = "Ruby" # 调用 name= 方法
end
虽然 self 本身与局部变量形式相同, 但由于它是引用对象本身时的保留字, 因此即使对他进行赋值, 也不会对其本身有任何影响. 像这样, 已经被系统使用且不能被我们自定义的变量名还有 nil
, true
, false
, __FILE__
, __LINE__
, __ENCODING__
等.
网友评论