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?

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top