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 中为方法设置别名时,别名不是指原始对象,而不是副本吗?
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 中为方法设置别名时,别名不是指原始对象,而不是副本吗?
您正在调用object_id
由返回的对象foo
,该对象是在方法中创建的字符串,因此每次都会有所不同。如果您只调用foo
两次,您会看到相同的结果。它每次都返回一个新字符串。如果您想要一个常量字符串,请:foo
改为返回符号。
除此之外,即使它们现在共享相同的实现,它们也是不同的方法。如果您覆盖foo
返回字符串“bar”,foo2
仍将继续返回“foo”。
根据您的各种评论重新开始一个新的答案。
在示例代码中,您调用的是方法,而不是引用它。你想用
method(:foo)
实际获取方法本身,而不是调用它的结果。
此外,object_id
这不是测试两个方法是否相同的正确方法,因为method(:foo)
每次都返回一个新的 Method 对象。打个比方,如果你打开同一个文件两次,即使底层文件相同,你也会有两个不同的文件句柄。相反,我认为你想要:
method(:foo) == method(:foo2)
如果您尝试一下,您会看到它返回true
.
尝试:
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