Подтвердить что ты не робот

В Ruby внутри метода класса есть сам класс или экземпляр?

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

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

Ответ 1

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

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

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

Foo.bar  # => Foo

Ответ 2

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

Ответ 3

Уже много ответов, но вот почему 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

Ответ 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

Счастливая рыбалка!