别名方法导致不同的对象?

时间:2009-03-08 17:57:13

标签: ruby methods alias string-interpolation

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中使用别名时,别名是否引用原始对象,而不是副本?

3 个答案:

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