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

Что означает "класс << я" в Rails?

Возможные дубликаты:
class < самоидентификация в Ruby
Может кто-нибудь объяснить класс < для меня?

Я хотел бы знать, что означает выражение class << self в классе модели? И как внутреннее выражение отличается от того, что вне него. Например:

class Post < ActiveRecord::Base

  class << self
     def search(q)
          # search from DB
     end
  end
   def search2(qq)
         # search from DB
   end
end

Что означает class << self?

Каковы различия между методом search(q) и search2(qq)?

4b9b3361

Ответ 1

То же самое, что и

class Post < ActiveRecord::Base

  def self.search(q)
    # Class Level Method
    # search from DB
  end

  def search2(qq)
    # Instance Level Method
    # search from DB
  end
end

Методы класса работают над классом (например, Post), методы экземпляра работают на экземплярах этого класса (например, Post.new)

Некоторым нравится стиль class << self; code; end;, потому что он сохраняет все методы уровня класса в хорошем блоке и в одном месте.

Другим нравится префикс каждого метода с self., чтобы явно знать, что это метод класса, а не метод экземпляра. Это вопрос стиля и того, как вы кодируете. Если вы поместите все методы класса в блок, например class << self, и этот блок достаточно длинный, строка class << self может отсутствовать в вашем представлении редактора, что затрудняет понимание того, что вы находитесь в блоке экземпляра класса.

С другой стороны, префикс каждого метода с помощью self. и смешивание с методами экземпляра также является плохой идеей, как вы знаете все методы класса при чтении кода.

Выберите идиому, которую вы предпочитаете для своей собственной базы кода, но если вы работаете над проектом с открытым исходным кодом или работаете с другим кодом, используйте правило форматирования кода.

Ответ 3

Он создает методы класса, а не методы экземпляра. Это то же самое, что и при выполнении def self.search(q). Эти два метода будут называться как:

Post.search(q)
Post.new.search(qq)

Ответ 4

search2 - это экземпляр-метод, а search - метод класса. Синтаксис class << self позволяет группировать методы класса ниже. Существует три способа определения методов класса в Ruby:

class MyClass
    def self.method
        # do sth.
    end

    def MyClass.method2
        # do sth.
    end

    class << self
        def method3
            # do sth.
        end 

        def another_class_method
            # do sth.
        end
    end
end

Класс-методы вызываются в классе, а не в экземпляре. Это личное предпочтение, которое из трех идиом вы хотите использовать. Я предпочитаю def self.method без особых причин.