В Ruby, внутри метода класса, self это класс или экземпляр? - PullRequest
18 голосов
/ 03 декабря 2010

Я знаю, что self - это экземпляр внутри метода экземпляра. Итак, является ли self класс внутри метода класса? Например, в Rails будет работать следующее?

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

Ответы [ 4 ]

21 голосов
/ 03 декабря 2010

Это правильно.self внутри метода класса находится сам класс.(А также внутри определения класса, такого как self в def self.coolpost.)

Вы можете легко проверить эти лакомые кусочки с помощью irb:

class Foo
  def self.bar
    puts self.inspect
  end
end

Foo.bar  # => Foo
5 голосов
/ 04 декабря 2010

Уже много ответов, но вот почему 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
5 голосов
/ 03 декабря 2010
class Test
    def self.who_is_self
        p self
    end
end

Test.who_is_self

output:

Test

Теперь, если вам нужно решение для конкретного Rails, оно называется named_scopes:

class Post < ActiveRecord::Base
   named_scope :cool, :conditions => { :name => 'cool' }
end

Используется так:

Post.cool
4 голосов
/ 03 декабря 2010

Краткий ответ: да

Что мне нравится делать с этими вопросами, так это просто запустить сеанс 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

Удачной рыбалки!

...