私はそれself
がインスタンスメソッド内のインスタンスであることを知っています。では、self
クラスはクラスメソッド内にあるのでしょうか?たとえば、次はRailsで機能しますか?
class Post < ActiveRecord::Base
def self.cool_post
self.find_by_name("cool")
end
end
私はそれself
がインスタンスメソッド内のインスタンスであることを知っています。では、self
クラスはクラスメソッド内にあるのでしょうか?たとえば、次はRailsで機能しますか?
class Post < ActiveRecord::Base
def self.cool_post
self.find_by_name("cool")
end
end
それは正しいです。self
クラスメソッドの中にはクラス自体があります。self
(また、 inなどのクラス定義内にもありdef self.coolpost
ます。)
これらの情報はirbで簡単にテストできます。
class Foo
def self.bar
puts self.inspect
end
end
Foo.bar # => Foo
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
すでに多くの答えがありますが、ここに自己がクラスである理由があります:
self
ドットは、ドットの前にあるものに変わります。したがって、-methodfoo.bar
に対して実行すると、はになります。クラスメソッドとの違いはありません。を呼び出すときは、に変更します。bar
self
foo
Post.cool_post
self
Post
ここで注意すべき重要なことは、メソッドがどのように定義されるかではなく、メソッド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
簡単な答え:はい
これらの質問で私がしたいのは、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
ハッピーフィッシング!