我知道这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
That is correct. self
inside a class method is the class itself. (And also inside the class definition, such as the self
in def self.coolpost
.)
You can easily test these tidbits with 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
output:
Test
Now if you want a Rails specific solution, it's called named_scopes:
class Post < ActiveRecord::Base
named_scope :cool, :conditions => { :name => 'cool' }
end
Used like this:
Post.cool
已经有很多答案了,但这就是self 是类的原因:
点更改self
为点之前的任何内容。因此,当您foo.bar
为 - 方法执行 then时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
钓鱼快乐!