Как вы предпочитаете определять методы класса в Ruby? - PullRequest
9 голосов
/ 19 мая 2009

Джон Нунемейкер недавно написал в блоге о различных способах определения методов класса в Ruby, предоставив следующие три альтернативы:

# Way 1
class Foo
  def self.bar
    puts 'class method'
  end
end

# Way 2
class Foo
  class << self
    def bar
      puts 'class method'
    end
  end
end

# Way 3
class Foo; end
def Foo.bar
  puts 'class method'
end
  • Какой ваш предпочтительный способ сделать это?
  • Вы предпочитаете что-то другое, чем те, что указаны выше?
  • Если вы используете более одного способа, при каких обстоятельствах вы их используете?

Ответы [ 6 ]

12 голосов
/ 19 мая 2009

Я последовательно использую Способ 1:

class Foo
  def self.bar
    puts 'class method'
  end
end

Это не многословно, и метод остается в том же контексте класса.

3 голосов
/ 25 мая 2009

Я обычно предпочитаю def self.foo для одиночных методов и class << self для длинных отрезков методов класса. Я чувствую, что это делает различие между частью метода класса и частью метода экземпляра определения класса.

1 голос
/ 20 мая 2009

Согласен с большинством пользователей. Я склонен использовать в первую очередь

# Way 1
class Foo
  def self.bar
    puts 'class method'
  end
end

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

Они были довольно малы, и в основном с вещами, с которыми нам не придется иметь дело на обычной основе. Посмотрим, смогу ли я проверить их и опубликовать.

1 голос
/ 19 мая 2009

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

0 голосов
/ 20 мая 2009

Я использую Путь № 3, но я думаю, что Путь № 1 также хорош. Это зависит от вашего использования. Если вы хотите, чтобы ваш код был «вырезан / вставлен» в другие модули и классы, тогда лучше использовать путь №1. Я использую Путь № 3, чтобы на самом деле было труднее вырезать / вставлять код, потому что мантра Руби - «не повторяйся», поэтому вам не следует часто вырезать / вставлять код ..

0 голосов
/ 20 мая 2009

Я считаю << для добавления метода слишком необычным (хотя я с радостью использую << со строками и IO). </p>

Я избегаю Foo.bar, потому что это означает повторяться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...