首页 > 代码库 > ruby中的self

ruby中的self

self,自己,在ruby中表示当前对象或默认对象。程序执行的任一时刻,有且仅有一个self。

 

1.谁成为self,在什么位置成为self?

要知道哪个对象是self,就必须知道当前的上下文。上下文主要有顶层上下文,类定义上下文,模块定义上下文,方法定义上下文。可以根据下图总结的内容进行self的判断。

上下文  例子哪个对象是self
顶层在任何定义块之外的代码main(内建的默认顶层对象)
类定义class C类对象C
模块定义module M  模块对象M
方法定义

1 顶层方法

def method_name

 

2实例方法定义

class C

  def method_name

 

3模块中的实例方法定义

module M

def method_name

 

4单例方法(包括类方法)

def obj.method_name

main(内建的默认顶层对象)

 

 

C的一个实例对象,这个实例对象响应method_name方法调用

 

 

 

(1)用M扩展的单个对象

(2)混含了M的类的一个对象实例

 

 

obj

 

1.1顶层中的self

顶层上下文的self是main,顶层方法的self也是main。main是object的一个对象。

 

1.2类和模块中定义中的self

类中的self是类对象本身

类中实例方法的对象是实例对象

模块的self是模块的名字

 

1.3单例方法中的self

obj作为对象,它的单例方法中的self就是obj。

 

2.self作为消息的默认接接收者

方法调用一般是obj.method的方式,用一个圆点标记,左边是接收者,右边是方法。但是,当接收者是self的时候,可以省略接收者和圆点。ruby将self当做默认的接收者,意味着你发送的消息会发给self。即method等价于self.method。

类方法中调用了hello。等价于self.hello。因为在类中,相当于A.hello,打印出了”hello world“。在类外使用hello时,self是main,没有这个函数,所以报错。用A.hello当然是对的。

但是值得注意的是,在调用写方法(以等号结束的方法)的时候,即使是发送消息给当前的self,也不能省略。例如调用方法venue=,要写成self.venue ="hello"。如果写成venue="hello",ruby则将它解释为对局部变量的赋值。

 

3实例变量和self

ruby中实例变量是以@开头的变量。值得注意的是,在ruby程序中看到的任何实例变量,都是属于程序中该位置的当前对象self。

第一个@var是属于类A的,因此在创建类之后就执行了,打印出hello。方法中的@var是属于类的实例对象的,因此在创建A的实例对象之后调用方法,打印出world。这两个@var完全无关。任何对象都可以有实例变量--它的信息和对象状态的私有存储处。