En realidad, la finalización automática funciona para .
. Las opciones de finalización se encuentran llamando al #methods
en el objeto. Esto se puede ver por sí mismo anulando Object.methods
:
>> def Object.methods; ["foo", "bar"]; end
=> nil
>> Object.[TAB]
Object.foo Object.bar
>> Object.
Tenga en cuenta que esto sólo funciona cuando la expresión a la izquierda de la .
es un literal. De lo contrario, hacer que el objeto llame al #methods
implicaría evaluar el lado izquierdo, lo que podría tener efectos secundarios. Esto se puede ver por sí mismo, así:
[continuing from above...]
>> def Object.baz; Object; end
=> nil
>> Object.baz.[TAB]
Display all 1022 possibilities? (y or n)
Añadimos un método #baz
a Object
que devuelve Object
sí. Luego, completamos automáticamente para obtener los métodos que podemos llamar en Object.baz
. Si el IRB llama al Object.baz.methods
, obtendría lo mismo que Object.methods
. En cambio, IRB tiene 1022 sugerencias. No estoy seguro de dónde vienen, pero es claramente una lista genérica que en realidad no se basa en el contexto.
El operador ::
es (también) que se utiliza para obtener las constantes de un módulo, mientras que .
no lo es. Es por eso que HTTP
aparecerá en la finalización para Net::
, pero no para Net.
. Net.HTTP
no es correcto, pero Net::HTTP
es.