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中使用别名时,别名是否引用原始对象,而不是副本?
答案 0 :(得分:2)
您正在object_id
返回的对象上调用foo
,这是在方法中创建的字符串,因此每次都会有所不同。如果你刚刚调用foo
两次,你会看到相同的结果。它每次都返回一个新字符串。如果您想要一个常量字符串,请返回符号:foo
。
过去,即使他们现在共享相同的实现,他们是不同的方法。如果您覆盖foo
以返回字符串“bar”,则foo2
仍将继续返回“foo”。
答案 1 :(得分:2)
重新开始回答您的各种评论。
在示例代码中,您调用方法,而不是引用它。你想用
method(:foo)
实际获取方法本身而不是调用它的结果。
此外,object_id
不是测试两个方法是否相同的正确方法,因为method(:foo)
每次都返回一个新的Method对象。对于可能使此更清楚的类比,如果您打开两次相同的文件,即使底层文件相同,也会有两个不同的文件句柄。相反,我认为你想要:
method(:foo) == method(:foo2)
,正如您将看到的那样,如果您尝试它,则返回true
。
答案 2 :(得分: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