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

比如这个代码

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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(3)
洪涛

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
Peter_Zhu

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.

迷茫

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
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!