Есть ли разница между ::и .при вызове методов класса в Ruby?
Вопрос
Простой вопрос, но мне стало любопытно about...is есть функциональная разница между следующими двумя командами?
String::class
String.class
Они оба делают то, чего я ожидаю, то есть возвращаются Class
-- но в чем разница между использованием ::
и тот .
?
Я замечаю, что в тех классах, у которых определены константы, автозаполнение IRB вернет константы в качестве доступных параметров, когда вы нажмете tab после ::
но не после .
, но я не знаю, в чем причина этого...
Решение
Тот Самый .
оператор в основном говорит: "отправьте это сообщение объекту".В вашем примере это вызов этого конкретного участника.Тот Самый ::
operator "детализирует" область, определенную слева от operator, а затем вызывает элемент, определенный справа от operator.
Когда вы используете ::
вы должны ссылаться на определенные элементы.При использовании .
вы просто отправляете сообщение объекту.Поскольку это сообщение может быть любым, автоматическое завершение не работает для .
в то время как это делает для ::
.
Другие советы
На самом деле, автоматическое завершение действительно работает для .
.Варианты завершения можно найти, позвонив по телефону #methods
на объекте.Вы можете убедиться в этом сами, переопределив Object.methods
:
>> def Object.methods; ["foo", "bar"]; end
=> nil
>> Object.[TAB]
Object.foo Object.bar
>> Object.
Обратите внимание, что это работает только тогда, когда выражение слева от .
является буквальным.В противном случае получение объекта для вызова #methods
включение потребовало бы оценки левой стороны, что могло бы иметь побочные эффекты.Вы тоже можете убедиться в этом сами:
[continuing from above...]
>> def Object.baz; Object; end
=> nil
>> Object.baz.[TAB]
Display all 1022 possibilities? (y or n)
Мы добавляем метод #baz
Для Object
который возвращает Object
сам по себе.Затем мы выполняем автозаполнение, чтобы получить методы, которые мы можем вызвать Object.baz
.Если IRB позвонит Object.baz.methods
, это привело бы к тому же , что и Object.methods
.Вместо этого у IRB есть 1022 предложения.Я не уверен, откуда они взялись, но это явно общий список, который на самом деле не основан на контексте.
Тот Самый ::
оператор (также) используется для получения констант модуля, в то время как .
это не так.Вот почему HTTP
будет отображаться в завершении для Net::
, но не для Net.
. Net.HTTP
это неверно, но Net::HTTP
есть.