alias di un metodo si traduce in oggetti diversi?
-
05-07-2019 - |
Domanda
def foo
"foo"
end
alias foo2 foo
puts "foo2: " + foo2.object_id.to_s
puts "foo: " + foo.object_id.to_s
Nell'esempio sopra, mi aspettavo di vedere lo stesso output object_id per ogni chiamata del metodo poiché fanno riferimento allo stesso metodo. Perché vedo diversi object_id? Quando si alias un metodo in Ruby, l'alias non fa riferimento all'oggetto originale, non a una copia?
Soluzione
Ricominciare con una nuova risposta in risposta ai tuoi vari commenti.
Nel codice di esempio, stai chiamando il metodo, senza fare riferimento a esso. Vuoi usare
method(:foo)
per ottenere effettivamente il metodo stesso e non il risultato della sua chiamata.
Inoltre, object_id
non è il modo giusto per verificare se due metodi sono uguali, perché method (: foo)
restituisce ogni volta un nuovo oggetto Method. Per un'analogia che potrebbe rendere questo più chiaro, se aprissi lo stesso file due volte avresti due handle di file distinti anche se il file sottostante era lo stesso. Invece, penso che tu voglia:
method(:foo) == method(:foo2)
che, come vedrai se lo provi, restituisce true
.
Altri suggerimenti
Stai chiamando object_id
sull'oggetto restituito da foo
, che è una stringa creata nel metodo e quindi sarà sempre diversa. Vedresti gli stessi risultati se avessi appena chiamato foo
due volte. Restituisce una nuova stringa ogni volta. Se si desidera una stringa costante, restituire invece il simbolo : foo
.
Oltre questo, anche se condividono la stessa implementazione in questo momento, sono metodi diversi. Se esegui l'override di foo
per restituire la stringa " bar " ;, foo2
continuerà comunque a restituire " foo " ;.
Prova:
FOO = "foo"
def foo
FOO
end
alias foo2 foo
puts "foo2: " + foo2.object_id.to_s
puts "foo: " + foo.object_id.to_s
Per ottenere l'effetto desiderato. & Quot; foo " è un'espressione e viene valutata ogni volta che viene chiamata la funzione. Per capire perché, considera che avresti potuto anche scrivere:
def foo
"It is now #{Time.now}"
end
alias foo2 foo
puts "foo2: " + foo2.object_id.to_s
puts "foo: " + foo.object_id.to_s