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

比如这个代码
classCategory...
defself.last_updated_at
order('updated_atdesc').limit(1).pluck(:updated_at).first.to_i
end
...
end
为什么不直接定义last_updated_at方法呢?
BIG阳
浏览 783回答 2
2回答

翻过高山走不出你

self指向当前class,所以这种定义方法会定义出class方法(classmethod),如果不加self.就会定义出实例方法(instancemethod)。这种self.的写法在你的例子里等同于:defCategory.last_updated_at...end

森栏

一个ruby对象可以调用的方法有两类。一类是定义于该对象的class中,叫instancemethod,比如deflast_updated_at#blahblahend那么Category的实例便可以调用该方法,而Category本身不可以category1=Category.newcategory2=Category.newcategory1.last_updated_at#legalcategory2.last_updated_at#legalCategory.last_updated_at#illegal另一类叫singletonmethod,它只能被一个对象调用,该对象的类不可以,与该对象同属一个类的其他对象也不可以。singletonmethod的定义方式如下#category1=Category.newdefcategory1.last_updated_at#blahblahend这样定义之后,只有category1这个对象才可以调用last_updated_at方法category1.last_updated_at#legalcategory2=Category.newcategory2.last_updated_at#illegalCategory.last_updated_at#illegalruby的类也是对象,也可以定义它自己的singletonmethod,比如defCategory.last_udpated_at#blahblahend这样一来只有Category可以调用last_updated_at方法,而它的实例不可以,其他类也不可以,确切说任何其他对象都不可以Category.last_updated_at#legalcategory=Category.newcategory.last_updated_at#illegal在Category类的定义内部(方法的外部),self指代Category本身,故而defCategory.last_udpated_at#blahblahend可以替换成defself.last_udpated_at#blahblahend这便是你问题中定义的那个方法。现在明白了吧?实质上它是Category的singletonmethod,而Category是一个类,类的singletonmethod又称为该类的classmethod,只能由该类本身调用。需要注意的是,classmethod就是singletonmethod,只不过它是一个类的singletonmethod,除此之外并没有什么特别之处。就像instancemethod由对象所属的class持有,singletonmethod也由对象的一个叫eigenclass的东西持有。关于eigenclass还有很多学问,这里就不提了。我会在文章里讲一下。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript