Объявление Модуля Ruby

есть ли разница между

class Bus::Driver
end

и

module Bus
  class Driver
  end
end

Если нет, какой синтаксис предпочтительнее?

3 ответов


есть ли разница между doing [...]?

единственная разница в том, что в class Bus::Driver на Bus модуль должны будет уже определен, а не стоять на второй.

какой синтаксис предпочтительнее?

это не конструктивный вопрос, но я лично предпочитаю второй, потому что он явно заявляет, что Bus модуль, а с первым я не вижу на первый взгляд если Bus модуль или класс.


это, само по себе:

class Bus::Driver
end

приведет к ошибке NameError: uninitialized constant Bus

так в какой-то момент Вы должны объявить class Bus или module Bus. Однако это не обязательно должна быть полная иерархия каждый раз.

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


первый синтаксис предпочтительнее, когда у вас есть различные классы модуля, разбросанные по нескольким файлам в проекте; и при условии module всегда определяется в PATH. Например, при создании gem.

второе более центральное, и должно быть сделано, когда речь идет о деталях. module не только включать class, Он включает в себя methods и constants etc для пространства имен тоже, что полезно.