Maison > Questions et réponses > le corps du texte
比如这个代码
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
方法呢?
PHP中文网2017-04-22 09:01:47
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 à :
def Category.last_updated_at
...
end
天蓬老师2017-04-22 09:01:47
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.
迷茫2017-04-22 09:01:47
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