1
def foo
    "foo"
end

alias foo2 foo
puts "foo2: " + foo2.object_id.to_s
puts "foo: " + foo.object_id.to_s

上記の例では、同じメソッドを参照しているため、メソッド呼び出しごとに同じ object_id 出力が表示されると予想していました。異なる object_id が表示されるのはなぜですか? Ruby でメソッドにエイリアスを設定すると、エイリアスはコピーではなく元のオブジェクトを参照しますか?

4

3 に答える 3

2

object_idによって返されるオブジェクトを呼び出していますfoo。これはメソッドで作成された文字列であるため、毎回異なります。foo2回電話しただけでも、同じ結果が表示されます。毎回新しい文字列を返します。定数文字列が必要な場合は、:foo代わりに記号を返します。

それを過ぎると、現在同じ実装を共有していても、それら異なるメソッドです。foo文字列「bar」を返すようにオーバーライドした場合foo2でも、「foo」を返し続けます。

于 2009-03-08T18:19:52.307 に答える
2

さまざまなコメントに応えて、新しい回答からやり直します。

サンプル コードでは、メソッドを参照しているのではなく、メソッドを呼び出しています。使いたい

method(:foo)

メソッドを呼び出した結果ではなく、実際にメソッド自体を取得します。

また、毎回新しい Method オブジェクトを返すobject_idため、2 つのメソッドが同じかどうかをテストする正しい方法ではありません。method(:foo)これをより明確にする例えとして、同じファイルを 2 回開いた場合、基になるファイルが同じであっても、2 つの異なるファイル ハンドルが作成されます。代わりに、次のことが必要だと思います。

method(:foo) ==  method(:foo2)

試してみるとわかるように、これは を返しますtrue

于 2009-03-09T00:06:01.273 に答える
1

試す:

FOO = "foo"
def foo
    FOO
    end

alias foo2 foo
puts "foo2: " + foo2.object_id.to_s
puts "foo: " + foo.object_id.to_s

あなたが望む効果を得るために。「foo」は式であり、関数が呼び出されるたびに評価されます。これがなぜなのかを理解するには、次のように書くこともできると考えてください:

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
于 2009-03-08T19:02:57.523 に答える