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