我知道self
是实例方法内部的实例。那么,在类方法中self
是否表示类本身?例如,以下代码在Rails中是否可行?
我知道self
是实例方法内部的实例。那么,在类方法中self
是否表示类本身?例如,以下代码在Rails中是否可行?
class Post < ActiveRecord::Base
def self.cool_post
self.find_by_name("cool")
end
end
我知道self
是实例方法内部的实例。那么,在类方法中self
是否表示类本身?例如,以下代码在Rails中是否可行?
我知道self
是实例方法内部的实例。那么,在类方法中self
是否表示类本身?例如,以下代码在Rails中是否可行?
class Post < ActiveRecord::Base
def self.cool_post
self.find_by_name("cool")
end
end
没错。在类方法中,self
指的是该类本身。(同样也适用于类定义内部,例如在def self.coolpost
中的self
)
你可以使用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
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
愉快地钓鱼吧!
find_by_name
而不需要加上 self :) - bradself
是个好主意?self.find_by_name
是 Ruby 查找find_by_name
的第一个地方吗?它会在其他地方查找吗?如果是全局定义的方法(在类外文件中定义的方法),那又怎么样呢? - ma11hew28Object
上的私有方法。例如尝试:def foo; end; Object.private_methods.include?(:foo) # => true
。这意味着它们基本上位于继承链的顶部,并且是最后被找到的。 - Stéphan Kochen