比如這個(gè)代碼classCategory
Ruby的class中定義以self.開頭的方法有何不同
BIG陽
2019-04-16 20:26:58
TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
self指向當(dāng)前class,所以這種定義方法會(huì)定義出class方法(classmethod),如果不加self.就會(huì)定義出實(shí)例方法(instancemethod)。這種self.的寫法在你的例子里等同于:defCategory.last_updated_at...end
TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超5個(gè)贊
一個(gè)ruby對(duì)象可以調(diào)用的方法有兩類。一類是定義于該對(duì)象的class中,叫instancemethod,比如deflast_updated_at#blahblahend那么Category的實(shí)例便可以調(diào)用該方法,而Category本身不可以category1=Category.newcategory2=Category.newcategory1.last_updated_at#legalcategory2.last_updated_at#legalCategory.last_updated_at#illegal另一類叫singletonmethod,它只能被一個(gè)對(duì)象調(diào)用,該對(duì)象的類不可以,與該對(duì)象同屬一個(gè)類的其他對(duì)象也不可以。singletonmethod的定義方式如下#category1=Category.newdefcategory1.last_updated_at#blahblahend這樣定義之后,只有category1這個(gè)對(duì)象才可以調(diào)用last_updated_at方法category1.last_updated_at#legalcategory2=Category.newcategory2.last_updated_at#illegalCategory.last_updated_at#illegalruby的類也是對(duì)象,也可以定義它自己的singletonmethod,比如defCategory.last_udpated_at#blahblahend這樣一來只有Category可以調(diào)用last_updated_at方法,而它的實(shí)例不可以,其他類也不可以,確切說任何其他對(duì)象都不可以Category.last_updated_at#legalcategory=Category.newcategory.last_updated_at#illegal在Category類的定義內(nèi)部(方法的外部),self指代Category本身,故而defCategory.last_udpated_at#blahblahend可以替換成defself.last_udpated_at#blahblahend這便是你問題中定義的那個(gè)方法?,F(xiàn)在明白了吧?實(shí)質(zhì)上它是Category的singletonmethod,而Category是一個(gè)類,類的singletonmethod又稱為該類的classmethod,只能由該類本身調(diào)用。需要注意的是,classmethod就是singletonmethod,只不過它是一個(gè)類的singletonmethod,除此之外并沒有什么特別之處。就像instancemethod由對(duì)象所屬的class持有,singletonmethod也由對(duì)象的一個(gè)叫eigenclass的東西持有。關(guān)于eigenclass還有很多學(xué)問,這里就不提了。我會(huì)在文章里講一下。
舉報(bào)