ホームページ  >  に質問  >  本文

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日前609

全員に返信(3)返信します

  • PHP中文网

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

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

    这种 self.

    この self. の書き方は次と同等です: 🎜 リーリー

    返事
    0
  • 天蓬老师

    天蓬老师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 についてはさらに多くの知識があるため、ここでは触れません。それについては記事の中でお話します。

    返事
    0
  • 迷茫

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

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

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

    リーリー

    返事
    0
  • キャンセル返事