18

我知道这self是实例方法中的实例。那么,类是self在类方法中吗?例如,以下内容可以在 Rails 中使用吗?

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

4 回答 4

23

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
于 2010-12-03T20:13:57.870 回答
5
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
于 2010-12-03T20:15:49.400 回答
5

已经有很多答案了,但这就是self 是类的原因:

点更改self为点之前的任何内容。因此,当您foo.bar为 - 方法执行 then时barself就是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
于 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 回答