aliasing-eine Methode, die Ergebnisse in den einzelnen Objekten?
-
05-07-2019 - |
Frage
def foo
"foo"
end
alias foo2 foo
puts "foo2: " + foo2.object_id.to_s
puts "foo: " + foo.object_id.to_s
In dem obigen Beispiel, erwartete ich, zu sehen, die gleichen object_id Ausgabe für jede Methode aufrufen, da Sie auf die gleiche Methode.Warum sehe ich unterschiedliche object_id ' s?Wenn Sie alias eine Methode in Ruby nicht der alias verweisen auf das ursprüngliche Objekt, nicht eine Kopie?
Lösung
Beginnen Sie mit einer neuen Antwort, die Antwort auf Ihre verschiedenen Kommentare.
In der Beispiel-code, Sie sind aufrufen die Methode, nicht auf Sie verweisen.Sie verwenden möchten
method(:foo)
um tatsächlich die Methode selbst und nicht das Ergebnis des Aufrufs ist es.
Auch, object_id
ist nicht der richtige Weg, um zu testen, ob zwei Methoden sind die gleichen, weil method(:foo)
liefert eine neue Methode-Objekt jedes mal.Für eine Analogie, die macht es vielleicht klarer, wenn Sie geöffnet die gleiche Datei zweimal hätten Sie zwei verschiedene Datei-handles, obwohl die zugrunde liegende Datei war die gleiche.Stattdessen denke ich, Sie wollen:
method(:foo) == method(:foo2)
die, wie Sie sehen werden, wenn Sie es versuchen, gibt true
.
Andere Tipps
Sie sind Berufung object_id
auf das Objekt zurückgegeben foo
,, das ist eine Zeichenfolge erstellt, in der Methode und somit wird jedes mal anders.Sie würden sehen, die gleichen Ergebnisse, wenn Sie Sie gerade genannt foo
zweimal.Es gibt einen neuen string-jedes mal.Wenn Sie möchten, dass ein konstanter string, return symbol :foo
statt.
Vergangenheit, die, obwohl Sie die gleiche Umsetzung jetzt sind verschiedene Methoden.Wenn Sie überschreiben foo
auf den string "bar", foo2
immer noch immer wieder "foo".
Versuchen:
FOO = "foo"
def foo
FOO
end
alias foo2 foo
puts "foo2: " + foo2.object_id.to_s
puts "foo: " + foo.object_id.to_s
Zu erhalten die Wirkung Sie wollen."foo" ist ein Ausdruck, und es wird bewertet, jedes mal, wenn die Funktion aufgerufen wird.Um zu sehen, warum das so ist, berücksichtigen Sie, dass Sie könnte genauso gut schreiben:
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