ruby语言里的self理解

关键的一句话:关键看谁调用self,self就属于谁

有3种情况:

1、在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
复制代码

输出结果:

Just started class S
S
Nested module S::M
S::M
Back in the outer level of S
S

2、在实例方法中,self代表调用方法的对象,对象实际上是内存里的一块内存空间,例如:

class S  
   def m  
        puts 'Class S method m:'  
        puts self  
    end  
end  
s = S.new  
s.m 

输出结果如下:

1 Class S method m:
2 #<S:0x2bc0a10>

3、在单例方法中,是为一个对象设置的函数,所以此时的self代表的是拥有这个方法对象,例如:

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

复制代码

其中,Object是最大的一个类,不需要再定义了,所以这里就省略了class部分对Object的定义。

输出结果为:

1 I am an object: here's self inside a singleton method of mine: 
2 #<Object:0x2835688>   #这里就是对象所占的内存地址
3 And inspecting obj from outside, to be sure it's the same object: 
4 #<Object:0x2835688>

4、在类方法中,self代表的是类本身

1 class S  
2   def S.x  
3     puts "Class method of class S"  
4     puts self  
5   end  
6 end  
7 S.x  

运行结果如下:

1 Class method of class S
2 S

 

posted on   101欢欢鱼  阅读(516)  评论(0编辑  收藏  举报

编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示