在Ruby中,在类方法中,自我是类还是实例?

时间:2010-12-03 20:08:57

标签: ruby class instance self class-method

我知道self是实例方法中的实例。那么,self类方法中的类是什么?例如,以下是否会在Rails中工作?

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

4 个答案:

答案 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 - 方法时,selffoo。类方法没有区别。致电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

快乐钓鱼!