Rumah  >  Soal Jawab  >  teks badan

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 hari yang lalu616

membalas semua(3)saya akan balas

  • PHP中文网

    PHP中文网2017-04-22 09:01:47

    self menunjuk ke kelas semasa, jadi kaedah takrifan ini akan mentakrifkan kaedah kelas Jika self. tidak ditambah, kaedah contoh akan ditakrifkan.

    Cara penulisan ini self. bersamaan dengan:

    dalam contoh anda
      def Category.last_updated_at
        ...
      end
    

    balas
    0
  • 天蓬老师

    天蓬老师2017-04-22 09:01:47

    Terdapat dua jenis kaedah yang boleh dipanggil oleh objek delima.
    Satu jenis ditakrifkan dalam kelas objek, dipanggil kaedah contoh, seperti

    def last_updated_at
        #blahblah
    end
    

    Kemudian contoh Kategori boleh memanggil kaedah ini, tetapi Kategori itu sendiri tidak boleh

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

    Jenis lain dipanggil kaedah tunggal, yang hanya boleh dipanggil oleh satu objek, bukan kelas objek, atau objek lain yang tergolong dalam kelas yang sama dengan objek. Kaedah tunggal ditakrifkan seperti berikut

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

    Selepas definisi ini, hanya objek category1 boleh memanggil kaedah last_updated_at

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

    Kelas Ruby juga merupakan objek, dan juga boleh menentukan kaedah tunggal mereka sendiri, seperti

    def Category.last_udpated_at
        #blahblah
    end
    

    Dengan cara ini, hanya Kategori boleh memanggil kaedah last_updated_at, tetapi bukan kejadiannya, mahupun kelas lain, atau mana-mana objek lain secara tepat

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

    Di dalam definisi kelas Kategori (di luar kaedah), diri merujuk kepada Kategori itu sendiri, jadi

    def Category.last_udpated_at
        #blahblah
    end
    

    boleh digantikan dengan

    def self.last_udpated_at
        #blahblah
    end
    

    Ini ialah kaedah yang ditakrifkan dalam soalan anda. Adakah anda faham sekarang? Pada asasnya, ia adalah kaedah tunggal bagi Kategori, dan Kategori ialah kelas Kaedah tunggal kelas juga dipanggil kaedah kelas kelas dan hanya boleh dipanggil oleh kelas itu sendiri.

    Perlu diingatkan bahawa kaedah kelas ialah kaedah tunggal, tetapi ia adalah kaedah tunggal kelas Selain daripada itu, tiada apa yang istimewa mengenainya. Sama seperti kaedah instance dipegang oleh kelas yang mempunyai objek, kaedah singleton juga dipegang oleh sesuatu yang dipanggil eigenclass objek. Terdapat lebih banyak pengetahuan tentang eigenclass, jadi saya tidak akan menyebutnya di sini. Saya akan bercakap mengenainya dalam artikel.

    balas
    0
  • 迷茫

    迷茫2017-04-22 09:01:47

    Tambah diri untuk mentakrifkan kaedah kelas, jika tidak, ia adalah kaedah contoh

    Tentukan kaedah kelas juga boleh

    class << self
        def last_updated_at
        order('updated_at desc').limit(1).pluck(:updated_at).first.to_i
      end
    end
    

    balas
    0
  • Batalbalas