在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
self上下文 Ruby的self有和Java的this相似之处,但又大不相同。Java的方法都是在实例方法中引用,所以this一般都是指向当前对象的。而Ruby的代码逐行执行,所以在不同的上下文(context)self就有了不同的含义,先来看看常见的context self都代表哪些 # 这个位置位于top level context,代表Object的默认对象main # 因为所有自定义类都位于main context之中,所以这是Object的实例方法
m = Person.new m.hello
上面只写了在类中的self,其实在module也是一样的。通过上面代码你可以发现,self一直引用着它所在位置上下文的实例/类。 self显式/隐式 你可以先试着运行下面代码,看看有什么意外发生没有
m = Person.new
如果你猜是today就大错特错了,答案是nil,为什么是nil呢,在第5行,我明明调用的是attr_accessor生成的name=方法赋值的啊,你可以在前面加上self试试,代码如你预期的一样执行了。在这种情况下name = your_name并没有去调用attr_accessor生成的xx=方法,而是将name当作了一个局部变量,如果显式的指定self,就没有问题了。 读到这,你是不是认为以后这种情况就一直用显式self去调用就好了,其实不然,下面的代码仍会说明一些问题
public private m = Person.new 上面代码说明: 第一个问题,显式self不可以调用private(protected的也一样)方法,而隐式的可以,这说明隐式更具有灵活性,但由于上面隐式调用也同时存在一定的“误解”,所以读者应该明白他们之间的区别,以便更好的使用。 第二个问题,self的方法不受private限制,其实我在这故意误导了读者,因为self的方法是类方法,而权限修饰符只对实例方法生效,所以private的类方法也可以直接访问。 self“怪异”写法 下面代码被我个人称为怪异写法,因为平时用不到,但偶尔会看到,但看起来又不太直观,这里列举一下 class Person a = Person.new b = a.metaclass # 首先要明白,类Person是Class的一个“实例”,a是Person的一个实例 class Person class << b b.hello # => hello b
c.hello # => hello Person 还有一个 class Person Person.work
转自:http://ilstar.blogbus.com/logs/59782933.html |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论