вопрос касательно кода рамок рельсов - PullRequest
3 голосов
/ 26 мая 2010

Я заметил, что код в структуре rails повсеместно использует следующее соглашение:

class SomeClass
  class << self
     def some function
     end
  end
end

вместо

class SomeClass
end

def SomeClass.function
end

и

class SomeClass
  def self.somefunction
  end
end

В чем причина такого выбора дизайна? Кажется, что все они выполняют то же самое

Ответы [ 3 ]

1 голос
/ 27 мая 2010

Они на самом деле разные. Внутреннее объявление класса в вашем первом примере фактически ссылается на собственный класс SomeClass. Собственный класс позволяет вам определять поведение экземпляров для ваших классов. Поэтому метод somefunction на самом деле принадлежит не классу, а экземплярам класса.

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

1 голос
/ 27 мая 2010

У Дэйва Томаса есть замечательный сериал метапрограммирования, посвященный этим сложным темам. Я полагаю, что второй эпизод говорит о классе «я». Снимки экрана можно найти на http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming

1 голос
/ 27 мая 2010

Одним из преимуществ выбора class << self является то, что он позволяет легко определять методы частного класса:

class SomeClass
  class << self
    def a_public_method
      "This is a public class method"
    end

    private
    def a_private_method
      "This is a private class method"
    end
  end
end

В противном случае вы должны использовать private_class_method , т. Е .:

class SomeClass
  def self.a_public_method
    "This is a public class method"
  end

  def self.a_private_method
    "This will be a private class method"
  end
  private_class_method :a_private_method
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...