Ruby的class中定义以self.开头的方法有何不同
高洛峰
高洛峰 2017-04-22 08:59:47
0
3
664

比如这个代码

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方法呢?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

répondre à tous(3)
洪涛

self pointe vers la classe actuelle, donc cette méthode de définition définira la méthode de classe. Si self. n'est pas ajouté, la méthode d'instance sera définie.

Cette façon d'écrire self. équivaut à :

dans votre exemple
  def Category.last_updated_at
    ...
  end
Peter_Zhu

Il existe deux types de méthodes qu'un objet Ruby peut appeler.
Un type est défini dans la classe de l'objet, appelé méthode d'instance, telle que

def last_updated_at
    #blahblah
end

Ensuite, l'instance de Category peut appeler cette méthode, mais la catégorie elle-même ne peut pas

category1=Category.new
category2=Category.new
category1.last_updated_at    #legal
category2.last_updated_at    #legal
Category.last_updated_at    #illegal

L'autre type est appelé méthode singleton, qui ne peut être appelée que par un seul objet, pas par la classe de l'objet, ni par d'autres objets appartenant à la même classe que l'objet. La méthode singleton est définie comme suit

#category1=Category.new
def category1.last_updated_at
    #blahblah
end

Après cette définition, seul l'objet catégorie1 peut appeler la méthode last_updated_at

category1.last_updated_at    #legal
category2=Category.new
category2.last_updated_at    #illegal
Category.last_updated_at    #illegal

Les classes Ruby sont également des objets, et peuvent également définir leurs propres méthodes singleton, telles que

def Category.last_udpated_at
    #blahblah
end

De cette façon, seule Category peut appeler la méthode last_updated_at, mais pas ses instances, ni les autres classes, ni aucun autre objet pour être exact

Category.last_updated_at    #legal
category=Category.new
category.last_updated_at    #illegal

Dans la définition de la classe Category (en dehors de la méthode), self fait référence à la catégorie elle-même, donc

def Category.last_udpated_at
    #blahblah
end

peut être remplacé par

def self.last_udpated_at
    #blahblah
end

C'est la méthode définie dans votre question. Comprenez-vous maintenant ? Essentiellement, il s'agit de la méthode singleton de Category, et Category est une classe. La méthode singleton d'une classe est également appelée méthode de classe et ne peut être appelée que par la classe elle-même.

Il convient de noter qu'une méthode de classe est une méthode singleton, mais c'est une méthode singleton d'une classe. A part ça, elle n'a rien de spécial. Tout comme la méthode d'instance est détenue par la classe à laquelle appartient l'objet, la méthode singleton est également détenue par ce qu'on appelle la classe propre de l'objet. Il y a beaucoup plus de connaissances sur les classes propres, donc je n'en parlerai pas ici. J'en parlerai dans l'article.

迷茫

Ajoutez self pour définir une méthode de classe, sinon c'est une méthode d'instance

Définir des méthodes de classe peut également être

class << self
    def last_updated_at
    order('updated_at desc').limit(1).pluck(:updated_at).first.to_i
  end
end
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal