Ну, константы в Ruby относительно переменны.Объекты, на которые они указывают, можно поменять местами (как в вашем примере), а также можно изменить их состояние.
class TestClass
Constant = []
end
TestClass::Constant << "no warning at all!"
Единственное преимущество, которое они предоставляют, - это предупреждения, генерируемые при создании существующей постоянной точки для другого объекта.См. «Ruby программирования», раздел «Переменные и константы» .Он старый, но все еще действителен.
Цель существования констант в Ruby - сигнализация того, что данную ссылку не следует изменять.Например, если вы делаете Math::PI = 3.0
, вы заслуживаете предупреждения.
Теоретически вы можете нарушить совместимость с исходной реализацией и обеспечить неизменность констант.В результате вы можете добиться небольшого улучшения производительности благодаря оптимизированной диспетчеризации методов.
В приведенном выше примере вы знаете, что Constant.is_a? Array
, поэтому отправка символа <<
фактическому методу может быть выполнена только один раз.на первом исполнении этой строки.Проблема в том, что Ruby позволяет вам переопределить Array#<<
, что делает проблему более сложной.
Проверка того, пытаются ли различные реализации Ruby использовать такую оптимизацию, потребует дополнительных исследований и поиска в их документации или источниках.