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?

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top