Ruby的self在不同的环境中有不同的含义,这点和java的this不同,原因是java实际上只有一种环境--在class的实例方法定义中使用,代表访问这个方法参数自动传进的那个对象。而由于ruby作为一个完全纯净的面向对象语言,任何东东都是对象,方法是对象,类也是对象...,所以self就会有很多环境,区分不同环境的self含义才能更好的理解程序的含义
一、Top Level Context
- puts self
打印出main,这个代表Object的默认对象main.
二、在class或module的定义中:
在class和module的定义中,self代表这个class或这module对象:
- class S
- puts 'Just started class S'
- puts self
- module M
- puts 'Nested module S::M'
- puts self
- end
- puts 'Back in the outer level of S'
- puts self
- end
输出结果:
写道
>ruby self1.rb
Just started class S
S
Nested module S::M
S::M
Back in the outer level of S
S
>Exit code: 0
Just started class S
S
Nested module S::M
S::M
Back in the outer level of S
S
>Exit code: 0
三、在实例的方法定义中:
这点和java的this代表的东东一样:程序自动传递的调用这个方法的对象
- class S
- def m
- puts 'Class S method m:'
- puts self
- end
- end
- s = S.new
- s.m
运行结果:
写道
>ruby self2.rb
Class S method m:
#<S:0x2835908>
>Exit code: 0
Class S method m:
#<S:0x2835908>
>Exit code: 0
四、在单例方法或者类方法中:
单例方法是针对一个对象添加的方法,只有这个对象拥有和访问这个方法,这时候self是拥有这个方法的对象:
- # self3.rb
- obj = Object.new
- def obj.show
- print 'I am an object: '
- puts "here's self inside a singleton method of mine:"
- puts self
- end
- obj.show
- print 'And inspecting obj from outside, '
- puts "to be sure it's the same object:"
- puts obj
运行结果:
写道
ruby self3.rb
I am an object: here's self inside a singleton method of mine:
#<Object:0x2835688>
And inspecting obj from outside, to be sure it's the same object:
#<Object:0x2835688>
>Exit code: 0
I am an object: here's self inside a singleton method of mine:
#<Object:0x2835688>
And inspecting obj from outside, to be sure it's the same object:
#<Object:0x2835688>
>Exit code: 0
在类方法中self代表这个类对象:
- # self4.rb
- class S
- def S.x
- puts "Class method of class S"
- puts self
- end
- end
- S.x
运行结果:
写道
>ruby self4.rb
Class method of class S
S
>Exit code: 0
Class method of class S
S
>Exit code: 0
从上面的例子我们可以看出不管是ruby的self还是java的this都表示在当前的环境下你可以访问的当前的或者默认的对象。