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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top