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

比如这个代码

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

全員に返信(3)
洪涛

self は現在のクラスを指すため、self. が追加されていない場合、この定義メソッドはインスタンス メソッドを定義します。 self 指向当前 class,所以这种定义方法会定义出 class 方法(class method),如果不加 self. 就会定义出实例方法(instance method)。

这种 self.

この self. の書き方は次と同等です: 🎜 リーリー
いいねを押す +0
Peter_Zhu

Rubyオブジェクトが呼び出せるメソッドは2種類あります。
1 つの型はオブジェクトのクラスで定義され、インスタンス メソッドと呼ばれます (

など) リーリー

その後、Category のインスタンスはこのメソッドを呼び出すことができますが、Category 自体は呼び出すことができません

リーリー

もう 1 つのタイプはシングルトン メソッドと呼ばれます。これは 1 つのオブジェクトによってのみ呼び出すことができ、オブジェクトのクラスや、そのオブジェクトと同じクラスに属する他のオブジェクトによって呼び出すことはできません。シングルトンメソッドは次のように定義されます

リーリー

この定義の後は、category1 オブジェクトのみが last_updated_at メソッドを呼び出すことができます

リーリー

Ruby クラスもオブジェクトであり、

などの独自のシングルトン メソッドを定義することもできます。 リーリー

このように、Category のみが last_updated_at メソッドを呼び出すことができますが、そのインスタンス、他のクラス、正確には他のオブジェクトは呼び出すことができません

リーリー

Categoryクラスの定義内(メソッドの外)では、selfはCategory自体を参照するため、

リーリー

で置き換えることができます リーリー

これはあなたの質問で定義されたメソッドです。もう分かりましたか?本質的に、これはカテゴリのシングルトン メソッドであり、カテゴリはクラスです。クラスのシングルトン メソッドは、クラスのクラス メソッドとも呼ばれ、クラス自体によってのみ呼び出すことができます。

クラスメソッドはシングルトンメソッドであることに注意してください。それ以外には特別なことはありません。インスタンス メソッドがオブジェクトが属するクラスによって保持されるのと同じように、シングルトン メソッドもオブジェクトの固有クラスと呼ばれるものによって保持されます。 eigenclass についてはさらに多くの知識があるため、ここでは触れません。それについては記事の中でお話します。

いいねを押す +0
迷茫

self を追加してクラスメソッドを定義します。それ以外の場合はインスタンスメソッドになります

クラスメソッドを定義することもできます

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート