Maison  >  Questions et réponses  >  le corps du texte

Ruby的class中定义以self.开头的方法有何不同

比如这个代码

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

高洛峰高洛峰2712 Il y a quelques jours617

répondre à tous(3)je répondrai

  • PHP中文网

    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 à :

    dans votre exemple
      def Category.last_updated_at
        ...
      end
    

    répondre
    0
  • 天蓬老师

    天蓬老师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.

    répondre
    0
  • 迷茫

    迷茫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
    

    répondre
    0
  • Annulerrépondre