比如這個代碼
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定義類別方法,不加是實例方法
定義類別方法也可以是