Ruby self在不同环境的含义

 Ruby的self在不同的环境中有不同的含义,这点和java的this不同,原因是java实际上只有一种环境--在class的实例方法定义中使用,代表访问这个方法参数自动传进的那个对象。而由于ruby作为一个完全纯净的面向对象语言,任何东东都是对象,方法是对象,类也是对象...,所以self就会有很多环境,区分不同环境的self含义才能更好的理解程序的含义

一、Top Level Context

Ruby代码 复制代码
  1. puts self    

 打印出main,这个代表Object的默认对象main.

二、在class或module的定义中:

在class和module的定义中,self代表这个class或这module对象:

Ruby代码 复制代码
  1. class S    
  2.   puts 'Just started class S'    
  3.   puts self    
  4.   module M    
  5.     puts 'Nested module S::M'    
  6.     puts self    
  7.   end    
  8.   puts 'Back in the outer level of S'    
  9.   puts self    
  10. end    

 输出结果:

 写道
>ruby self1.rb 
Just started class S 

Nested module S::M 
S::M 
Back in the outer level of S 

>Exit code: 0

 三、在实例的方法定义中:

这点和java的this代表的东东一样:程序自动传递的调用这个方法的对象

Java代码 复制代码
  1. class S    
  2.   def m    
  3.     puts 'Class S method m:'    
  4.     puts self    
  5.   end    
  6. end    
  7. s = S.new    
  8. s.m    

 运行结果:

 写道
>ruby self2.rb 
Class S method m: 
#<S:0x2835908> 
>Exit code: 0

 四、在单例方法或者类方法中:

单例方法是针对一个对象添加的方法,只有这个对象拥有和访问这个方法,这时候self是拥有这个方法的对象:

Ruby代码 复制代码
  1. # self3.rb    
  2. obj = Object.new    
  3. def obj.show    
  4.   print 'I am an object: '    
  5.   puts "here's self inside a singleton method of mine:"    
  6.   puts self    
  7. end    
  8. obj.show    
  9. print 'And inspecting obj from outside, '   
  10. puts "to be sure it's the same object:"    
  11. 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

 在类方法中self代表这个类对象:

Ruby代码 复制代码
  1. # self4.rb    
  2. class S    
  3.   def S.x    
  4.     puts "Class method of class S"    
  5.     puts self    
  6.   end    
  7. end    
  8. S.x    

 运行结果:

 写道
>ruby self4.rb 
Class method of class S 

>Exit code: 0

 从上面的例子我们可以看出不管是ruby的self还是java的this都表示在当前的环境下你可以访问的当前的或者默认的对象。

以上来自http://rubylearning.com/satishtalim/ruby_self.html 的总结

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值