define - ruby local variable



C'è una differenza tra:: e. quando si chiamano i metodi di classe in Ruby? (2)

Il . l'operatore dice fondamentalmente "invia questo messaggio all'oggetto". Nel tuo esempio chiama quel particolare membro. L'operatore :: esegue il drill down sull'ambito definito a sinistra dell'operatore, quindi chiama il membro definito sul lato destro dell'operatore.

Quando usi :: devi fare riferimento ai membri che sono definiti. Quando si usa stai semplicemente inviando un messaggio all'oggetto. Poiché questo messaggio potrebbe essere qualsiasi cosa, il completamento automatico non funziona . mentre lo fa per :: .

https://src-bin.com

Domanda semplice, ma di cui sono stato curioso ... c'è una differenza funzionale tra i seguenti due comandi?

String::class
String.class

Entrambi fanno ciò che mi aspetto - vale a dire restituiscono Class - ma qual è la differenza tra l'uso di :: e il . ?

Ho notato che su quelle classi che hanno costanti definite, il completamento automatico dell'IRB restituirà le costanti come opzioni disponibili quando si preme tab dopo :: ma non dopo . , ma non so quale sia la ragione di questo ...


Answer #1

In realtà, il completamento automatico funziona per . . Le opzioni di completamento si trovano chiamando #methods sull'oggetto. Puoi vederlo da solo sovrascrivendo Object.methods :

>> def Object.methods; ["foo", "bar"]; end
=> nil
>> Object.[TAB]
Object.foo  Object.bar
>> Object.

Si noti che questo funziona solo quando l'espressione a sinistra del . è un letterale. Altrimenti, ottenere l'oggetto per chiamare #methods implicherebbe la valutazione del lato sinistro, che potrebbe avere effetti collaterali. Puoi vederlo anche tu:

[continuing from above...]
>> def Object.baz; Object; end
=> nil
>> Object.baz.[TAB]
Display all 1022 possibilities? (y or n)

Aggiungiamo un metodo #baz a Object che restituisce Object stesso. Quindi eseguiamo il completamento automatico per ottenere i metodi che possiamo chiamare su Object.baz . Se IRB ha chiamato Object.baz.methods , otterrebbe la stessa cosa di Object.methods . Invece, IRB ha 1022 suggerimenti. Non sono sicuro da dove vengano, ma è chiaramente un elenco generico che non è in realtà basato sul contesto.

L'operatore :: è (anche) utilizzato per ottenere le costanti di un modulo, mentre . non è. Ecco perché HTTP apparirà nel completamento per Net:: , ma non per Net. . Net.HTTP non è corretto, ma Net::HTTP è.





syntax