Причина, по которой второй пример здесь не срабатывает, заключается в том, что не , потому что Dog - это не объект-компаньон, а потому что вы определили новый дубликат класса Dog. Я всегда рассматриваю traits
и classes
как одну категорию, а objects
как другую - и object
- это единичный экземпляр свойства или класса.
Почему вы не можете создавать классы с одинаковыми именами?
Невозможно различить две сущности, если это разрешено.
Почему вы можете создавать (класс / черта) и объект с тем же именем?
Вы можете различать их, потому что class
или trait
- это тип , а объект - это значение .
Когда вы должны называть ваши объекты тем же именем, что и классы?
Если вы не хотите определять сопутствующий объект, значит, ваши последствия для объекта будут работать. Или, если вы хотите определить удобный apply
метод для объекта. В противном случае я совсем не беспокоюсь ни о том, является ли объект companion
или нет, но часто для удобства создаю объекты с именем класса.