Почему `class ‹‹ self` более распространен, чем `class ‹‹ Foo` для открытия собственного класса объекта класса?

Программисты Ruby обычно используют class << self внутри тела класса, чтобы открыть собственный класс объекта класса, например:

class Foo
  class << self
    # ...
  end
end

Однако я редко вижу эту эквивалентную форму (предположим, что Foo уже определен как класс):

class << Foo
  # ...
end

Есть ли причина предпочесть первый стиль второму?


person Chris Jester-Young    schedule 16.07.2014    source источник
comment
Стилистически это упрощает понимание операции с помощью последовательной идиомы.   -  person user2864740    schedule 16.07.2014
comment
Я ожидаю, что тот же ответ будет применяться, если вы спросите, почему методы класса обычно определяются def self.a ... end, а не def A.a ... end. В обоих случаях использование self уменьшает на одну количество строк в вашем коде, которые требуют внимания, если вы переименуете класс. Я не могу думать ни о какой другой пользе.   -  person Cary Swoveland    schedule 17.07.2014


Ответы (1)


При использовании class << Foo или при явном определении def Foo.some_method(args) вы повторяете имя класса.

Использование class << self является DRYer и упрощает рефакторинг (изменение имени класса выполняется в одном месте, и его не нужно повторять в коде), а также копирование и вставка в другие классы/проекты.

class Foo1
  # ..
end

class << Foo # <- :(
  #..
end
person Uri Agassi    schedule 16.07.2014
comment
В примерах ОП нет повторения. Оба упоминают Foo ровно один раз. - person Jörg W Mittag; 17.07.2014
comment
@JörgWMittag - из OP (assume that Foo is already defined to be a class) - если бы это не было упомянуто ранее, вы бы получили uninitialized constant Foo - person Uri Agassi; 17.07.2014
comment
@JörgWMittag OP говорит, что класс определен в другом месте для второго примера. Поэтому, если этот (определенный в другом месте) класс когда-либо был переименован, вам пришлось бы изменить имя во втором примере. Вместо этого первый пример, при условии, что он определен в файле, где указано имя класса, изменять не нужно. - person Benissimo; 17.07.2014
comment
Любой, кто предпочитает использовать метод def self.xyz любому из решений? - person konsolebox; 17.07.2014
comment
@UriAgassi Как насчет случая, когда вы открываете собственный класс класса в файле, отличном от того, в котором класс был определен? (например, обезьянье исправление встроенного класса.) В этом случае вы не можете избежать именования класса, так есть ли преимущество в использовании class Object; class << self по сравнению с class << Object? - person Chris Jester-Young; 17.07.2014
comment
@ChrisJester-Young - я думаю, что в этом случае наиболее заметным преимуществом class << self является соответствие - нет смысла использовать менее распространенный синтаксис, потому что он сохраняет несколько символов, только чтобы его было труднее читать, поскольку он менее известен . - person Uri Agassi; 17.07.2014