84669 人學習
152542 人學習
20005 人學習
5487 人學習
7821 人學習
359900 人學習
3350 人學習
180660 人學習
48569 人學習
18603 人學習
40936 人學習
1549 人學習
1183 人學習
32909 人學習
比如这个代码
class Category < ActiveRecord::Base ... def self.last_updated_at order('updated_at desc').limit(1).pluck(:updated_at).first.to_i end ... end
为什么不直接定义last_updated_at方法呢?
last_updated_at
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
self 指向当前 class,所以这种定义方法会定义出 class 方法(class method),如果不加 self. 就會定義出實例方法(instance method)。
self
self.
這種 self. 的寫法在你的例子裡等同於:
def Category.last_updated_at ... end
一個ruby物件可以呼叫的方法有兩類。 一類是定義於該物件的class中,叫instance method,例如
def last_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
另一類叫singleton method,它只能被一個物件調用,該物件的類別不可以,與該物件同屬一個類別的其他物件也不可以。 singleton method的定義方式如下
#category1=Category.new def category1.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的類別也是對象,也可以定義它自己的singleton method,例如
def Category.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本身,故而
可以替換成
def self.last_udpated_at #blahblah end
這便是你問題中定義的那個方法。現在明白了吧?實質上它是Category的singleton method,而Category是一個類,類的singleton method又稱為該類的class method,只能由該類本身呼叫。
要注意的是,class method就是singleton method,只不過它是一個類別的singleton method,除此之外並沒有什麼特別之處。就像instance method由對象所屬的class持有,singleton method也由對象的一個叫eigenclass的東西持有。關於eigenclass還有很多學問,這裡就不提了。我會在文章裡講一下。
加self定義類別方法,不加是實例方法
定義類別方法也可以是
class << self def last_updated_at order('updated_at desc').limit(1).pluck(:updated_at).first.to_i end end
self
指向当前 class,所以这种定义方法会定义出 class 方法(class method),如果不加self.
就會定義出實例方法(instance method)。這種
self.
的寫法在你的例子裡等同於:一個ruby物件可以呼叫的方法有兩類。
一類是定義於該物件的class中,叫instance method,例如
那麼Category的實例便可以呼叫該方法,而Category本身不可以
另一類叫singleton method,它只能被一個物件調用,該物件的類別不可以,與該物件同屬一個類別的其他物件也不可以。 singleton method的定義方式如下
這樣定義之後,只有category1這個物件才可以呼叫last_updated_at方法
ruby的類別也是對象,也可以定義它自己的singleton method,例如
這樣一來只有Category可以呼叫last_updated_at方法,而它的實例不可以,其他類別也不可以,確切地說任何其他物件都不可以
在Category類別的定義內部(方法的外部),self指涉Category本身,故而
可以替換成
這便是你問題中定義的那個方法。現在明白了吧?實質上它是Category的singleton method,而Category是一個類,類的singleton method又稱為該類的class method,只能由該類本身呼叫。
要注意的是,class method就是singleton method,只不過它是一個類別的singleton method,除此之外並沒有什麼特別之處。就像instance method由對象所屬的class持有,singleton method也由對象的一個叫eigenclass的東西持有。關於eigenclass還有很多學問,這裡就不提了。我會在文章裡講一下。
加self定義類別方法,不加是實例方法
定義類別方法也可以是