为了账号安全,请及时绑定邮箱和手机立即绑定

Ruby的class中定义以self.开头的方法有何不同

Ruby的class中定义以self.开头的方法有何不同

BIG阳 2019-04-16 20:26:58
比如这个代码classCategory
查看完整描述

2 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

self指向当前class,所以这种定义方法会定义出class方法(classmethod),如果不加self.就会定义出实例方法(instancemethod)。
这种self.的写法在你的例子里等同于:
defCategory.last_updated_at
...
end
                            
查看完整回答
反对 回复 2019-04-16
?
森栏

TA贡献1810条经验 获得超5个赞

一个ruby对象可以调用的方法有两类。
一类是定义于该对象的class中,叫instancemethod,比如
deflast_updated_at
#blahblah
end
那么Category的实例便可以调用该方法,而Category本身不可以
category1=Category.new
category2=Category.new
category1.last_updated_at#legal
category2.last_updated_at#legal
Category.last_updated_at#illegal
另一类叫singletonmethod,它只能被一个对象调用,该对象的类不可以,与该对象同属一个类的其他对象也不可以。singletonmethod的定义方式如下
#category1=Category.new
defcategory1.last_updated_at
#blahblah
end
这样定义之后,只有category1这个对象才可以调用last_updated_at方法
category1.last_updated_at#legal
category2=Category.new
category2.last_updated_at#illegal
Category.last_updated_at#illegal
ruby的类也是对象,也可以定义它自己的singletonmethod,比如
defCategory.last_udpated_at
#blahblah
end
这样一来只有Category可以调用last_updated_at方法,而它的实例不可以,其他类也不可以,确切说任何其他对象都不可以
Category.last_updated_at#legal
category=Category.new
category.last_updated_at#illegal
在Category类的定义内部(方法的外部),self指代Category本身,故而
defCategory.last_udpated_at
#blahblah
end
可以替换成
defself.last_udpated_at
#blahblah
end
这便是你问题中定义的那个方法。现在明白了吧?实质上它是Category的singletonmethod,而Category是一个类,类的singletonmethod又称为该类的classmethod,只能由该类本身调用。
需要注意的是,classmethod就是singletonmethod,只不过它是一个类的singletonmethod,除此之外并没有什么特别之处。就像instancemethod由对象所属的class持有,singletonmethod也由对象的一个叫eigenclass的东西持有。关于eigenclass还有很多学问,这里就不提了。我会在文章里讲一下。
                            
查看完整回答
反对 回复 2019-04-16
  • 2 回答
  • 0 关注
  • 782 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号