В конкретном случае String
против ::String
ответ таков: примерно никогда не будет разницы.
В общем случае константы X
против ::X
, конечно. X
может быть A::B::C::X
или A::B::X
или просто X
, но ::X
всегда "просто X
", тогда как "X
" может быть любым из них.
String
очень важно, однако, так что никто не переопределит его случайно. В маловероятном случае, когда определен внутренний класс или модуль с именем String
, наиболее вероятно, что содержащийся в нем код использует его, а не String
.
Обновление: Я должен добавить, что простое видение class String; end
не определяет класс String
в том смысле, который, я думаю, вы имеете в виду. В Ruby классы могут быть открыты заново. Ключевое слово class
может содержать или не содержать новый класс. Это может быть просто добавление поведения к существующему, и если внутри ничего нет, то это просто запрет. Поведение старого класса все еще там,