我知道self
是实例方法中的实例。那么,self
类方法中的类是什么?例如,以下是否会在Rails中工作?
class Post < ActiveRecord::Base
def self.cool_post
self.find_by_name("cool")
end
end
答案 0 :(得分:21)
这是正确的。类方法中的self
是类本身。 (以及类定义中的内容,例如self
中的def self.coolpost
。)
您可以使用irb:
轻松测试这些花絮class Foo
def self.bar
puts self.inspect
end
end
Foo.bar # => Foo
答案 1 :(得分: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
答案 2 :(得分:5)
已有很多答案,但为什么 self就是这个类:
点将self
更改为点之前的任何内容。因此,当您执行foo.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
答案 3 :(得分: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
快乐钓鱼!