Есть ли разница между :: и. при вызове методов класса в Ruby? - PullRequest
24 голосов
/ 04 сентября 2008

Простой вопрос, но тот, который меня интересовал ... есть ли функциональная разница между следующими двумя командами?

String::class
String.class

Они оба делают то, что я ожидаю - то есть они возвращают Class - но в чем разница между использованием :: и .?

Я заметил, что в тех классах, для которых определены константы, автозавершение IRB вернет константы в качестве доступных параметров, когда вы нажимаете клавишу табуляции после ::, но не после ., но я не знаю, в чем причина это ...

Ответы [ 2 ]

35 голосов
/ 04 сентября 2008

Оператор . в основном говорит «отправить это сообщение объекту». В вашем примере это вызывает этот конкретный член. Оператор :: «сверлит» до области, определенной слева от оператора, а затем вызывает член, определенный справа от оператора.

Когда вы используете ::, вы должны ссылаться на членов, которые определены. При использовании . вы просто отправляете сообщение объекту. Поскольку это сообщение может быть чем угодно, автозаполнение не работает для ., а для ::.

11 голосов
/ 07 сентября 2008

На самом деле автозаполнение работает для .. Варианты завершения можно найти, вызвав #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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...