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,该对象是在方法中创建的字符串,因此每次都会有所不同。如果您只调用foo两次,您会看到相同的结果。它每次都返回一个新字符串。如果您想要一个常量字符串,请:foo改为返回符号。

除此之外,即使它们现在共享相同的实现,它们也是不同的方法。如果您覆盖foo返回字符串“bar”,foo2仍将继续返回“foo”。

于 2009-03-08T18:19:52.307 回答
2

根据您的各种评论重新开始一个新的答案。

在示例代码中,您调用的是方法,而不是引用它。你想用

method(:foo)

实际获取方法本身,而不是调用它的结果。

此外,object_id这不是测试两个方法是否相同的正确方法,因为method(:foo)每次都返回一个新的 Method 对象。打个比方,如果你打开同一个文件两次,即使底层文件相同,你也会有两个不同的文件句柄。相反,我认为你想要:

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 回答