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