18

私はそれselfがインスタンスメソッド内のインスタンスであることを知っています。では、selfクラスはクラスメソッド内にあるのでしょうか?たとえば、次はRailsで機能しますか?

class Post < ActiveRecord::Base
  def self.cool_post
    self.find_by_name("cool")
  end
end
4

4 に答える 4

23

それは正しいです。selfクラスメソッドの中にはクラス自体があります。self(また、 inなどのクラス定義内にもありdef self.coolpostます。)

これらの情報はirbで簡単にテストできます。

class Foo
  def self.bar
    puts self.inspect
  end
end

Foo.bar  # => Foo
于 2010-12-03T20:13:57.870 に答える
5
class Test
    def self.who_is_self
        p self
    end
end

Test.who_is_self

出力:

テスト

Rails固有のソリューションが必要な場合は、named_scopesと呼ばれます。

class Post < ActiveRecord::Base
   named_scope :cool, :conditions => { :name => 'cool' }
end

このように使用されます:

Post.cool
于 2010-12-03T20:15:49.400 に答える
5

すでに多くの答えがありますが、ここに自己がクラスである理由があります:

selfドットは、ドットの前にあるものに変わります。したがって、-methodfoo.barに対して実行すると、はになります。クラスメソッドとの違いはありません。を呼び出すときは、に変更します。barselffooPost.cool_postselfPost

ここで注意すべき重要なことは、メソッドがどのように定義されるかではなく、メソッドselfがどのように呼び出されるかということです。これが機能する理由です。

class Foo
  def self.bar
    self
  end
end

class Baz < Foo
end

Baz.bar # => Baz

またはこれ:

module Foo
  def bar
    self
  end
end

class Baz
  extend Foo
end

Baz.bar # => Baz
于 2010-12-04T12:53:13.147 に答える
4

簡単な答え:はい

これらの質問で私がしたいのは、irbまたは./script/consoleセッションを起動することです。

次に、次の操作を実行して魔法を確認できます。

ruby-1.8.7-p174 > class TestTest
ruby-1.8.7-p174 ?>  def self.who_am_i
ruby-1.8.7-p174 ?>    return self
ruby-1.8.7-p174 ?>    end
ruby-1.8.7-p174 ?>  end
 => nil 
ruby-1.8.7-p174 > TestTest.who_am_i
 => TestTest

ハッピーフィッシング!

于 2010-12-03T20:19:15.247 に答える