Рубиновый класс << Klass = Module::new

У меня есть следующий синтаксис в фрагменте кода, и я не уверен, что он делает.

class << PushableModule = Module::new
 def new *args, &blk
   m = Module::new( *args, &blk )
   m.extend Pushable
   m
 end
end

Во-первых, класс или модуль PushableModule не существует в файле / программе, и, во-вторых, кажется, что я получаю его собственный класс, а затем устанавливаю его равным Module::new до определения блока, который я просто не понимаю. Может кто-нибудь объяснить мне это (а также то, что на самом деле делает фрагмент кода)?

1 ответ

Решение

Вы неправильно указали приоритет оператора. Это значит

class << (PushableModule = Module::new)
  ...
end

Это создает модуль Module::new, затем называет это как PushableModuleзатем открывает свой собственный класс <<,

Это переписывает конструктор PushableModule, поскольку new должен быть определен как PushableModule.new, а не как метод экземпляра, определение выполняется в собственном классе.

Обычно вы не перезаписываете new, но определить метод экземпляра initialize, но в некоторых особых случаях new Конструктор может быть переписан.

Другие вопросы по тегам