比如这个代码classCategory
2 回答
翻过高山走不出你
TA贡献1875条经验 获得超3个赞
self指向当前class,所以这种定义方法会定义出class方法(classmethod),如果不加self.就会定义出实例方法(instancemethod)。这种self.的写法在你的例子里等同于:defCategory.last_updated_at...end
森栏
TA贡献1810条经验 获得超5个赞
一个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还有很多学问,这里就不提了。我会在文章里讲一下。
添加回答
举报
0/150
提交
取消
