比如这个代码
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
は現在のクラスを指すため、self.
が追加されていない場合、この定義メソッドはインスタンス メソッドを定義します。 self
指向当前 class,所以这种定义方法会定义出 class 方法(class method),如果不加 self.
就会定义出实例方法(instance method)。
这种 self.
self.
の書き方は次と同等です: 🎜
リーリー天蓬老师2017-04-22 09:01:47
Rubyオブジェクトが呼び出せるメソッドは2種類あります。
1 つの型はオブジェクトのクラスで定義され、インスタンス メソッドと呼ばれます (
その後、Category のインスタンスはこのメソッドを呼び出すことができますが、Category 自体は呼び出すことができません
リーリーもう 1 つのタイプはシングルトン メソッドと呼ばれます。これは 1 つのオブジェクトによってのみ呼び出すことができ、オブジェクトのクラスや、そのオブジェクトと同じクラスに属する他のオブジェクトによって呼び出すことはできません。シングルトンメソッドは次のように定義されます
リーリーこの定義の後は、category1 オブジェクトのみが last_updated_at メソッドを呼び出すことができます
リーリーRuby クラスもオブジェクトであり、
などの独自のシングルトン メソッドを定義することもできます。 リーリーこのように、Category のみが last_updated_at メソッドを呼び出すことができますが、そのインスタンス、他のクラス、正確には他のオブジェクトは呼び出すことができません
リーリーCategoryクラスの定義内(メソッドの外)では、selfはCategory自体を参照するため、
リーリーは
で置き換えることができます リーリーこれはあなたの質問で定義されたメソッドです。もう分かりましたか?本質的に、これはカテゴリのシングルトン メソッドであり、カテゴリはクラスです。クラスのシングルトン メソッドは、クラスのクラス メソッドとも呼ばれ、クラス自体によってのみ呼び出すことができます。
クラスメソッドはシングルトンメソッドであることに注意してください。それ以外には特別なことはありません。インスタンス メソッドがオブジェクトが属するクラスによって保持されるのと同じように、シングルトン メソッドもオブジェクトの固有クラスと呼ばれるものによって保持されます。 eigenclass についてはさらに多くの知識があるため、ここでは触れません。それについては記事の中でお話します。