Ruby中的self

本文解析了Ruby语言中self关键字的意义及其在类定义和方法内部的不同作用。通过实例展示了在class内部self代表当前类,而在方法内部self则指代方法调用者。并详细解释了如何定义类方法及self在其中的应用。
摘要由CSDN通过智能技术生成

来自Ruy-china的一篇帖子,原文出自:http://fsword.github.com/blog/2012/06/29/rubyzhong-de-self/

 

ruby-china.org 上有人问self的含义,发篇帖子解释一下
ruby里面的class关键字和def关键字的作用其实是改变上下文,这个self就是被改变的上下文中最重要的一个,按照ruby语法,遇到这样的关键字,self的含义就会变化
* 在class内部,self代表的是当前这个类本身

1
2
3
4
5
6
$ cat a.rb
class A
  puts self
end
$ ruby a.rb
A
  • 而通过def进入方法以后,(在方法内部写的)self指的是这个方法的当前调用者
1
2
3
4
5
6
7
8
9
$ cat a.rb
class A
  def x
    p self
  end
end
A.new.x
$ ruby a.rb
#<A:0x00000002705fb0>

如上所示,这次打印出来的self是类A的一个实例而不是类A本身

这两个原则非常重要,现在我们看看方法前加self是什么意思

1
2
3
4
5
6
7
8
9
10
11
$ cat a.rb
class A
  def self.x
    p self
  end
end
A.x
A.new.x
$ ruby a.rb
A
a.rb:7:in `<main>': undefined method `x' for #<A:0x00000001a83f58> (NoMethodError)

显然,这个方法看起来像是我们常说的“类方法”而不是实例方法(这个例子中,实例方法x不存在,于是抛出了异常),我们通常这么理解——

方法前的self在class内部,所以它表示类A,这样,x方法的调用者是类A自身(而不是它的实例),根据之前的原则,在def关键字内部,self表示的是这个方法的调用者,在这里就是类A自己

最后补充一下——
* ruby中的类本身也是对象,所以所谓“类方法”是个不太准确的描述,所有的方法都是属于某个对象的,这里的self.x其实是类A(再次强调:是A自己而不是A的实例)的“专有方法”,更进一步的理解要结合对eigenclass这个概念的理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值