2011-01-10 3 views
12

Возможные Дубликаты:
class << self idiom in Ruby
Can someone please explain class << self to me?Что означает «класс << self» в Rails?

Я хотел бы знать, что делает 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)?

+0

search2 - очень плохое имя метода. –

+0

А также дубликат [Rails class << self] (http://stackoverflow.com/questions/2567956/rails-class-self) и [Разница между «self.method_name» и «class << self» в Ruby ] (HTTP: // StackOverflow.com/questions/2025569/difference-between-self-method-name-and-class-self-in-ruby) и [Может кто-нибудь объяснить класс << self мне?] (http://stackoverflow.com/questions/4149700/может-кто-то пожалуйста, объясните-класс-я-к-я). Перед отправкой вопросов, пожалуйста, выполните поиск. – Phrogz

ответ

22

То есть так же, как

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. новый)

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

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

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

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

1

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

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

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 без особых причин.

Смежные вопросы