【问题标题】:aliasing a method results in different objects?别名方法导致不同的对象?
【发布时间】:2009-03-08 17:57:13
【问题描述】:
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 中为方法设置别名时,别名不是指原始对象,而不是副本吗?

【问题讨论】:

    标签: ruby methods alias string-interpolation


    【解决方案1】:

    从一个新的答案开始,以响应您的各种 cmet。

    在示例代码中,您调用方法,而不是引用它。你想用

    method(:foo)
    

    实际获取方法本身,而不是调用它的结果。

    另外,object_id 不是测试两个方法是否相同的正确方法,因为method(:foo) 每次都返回一个新的 Method 对象。打个比方,如果你打开同一个文件两次,即使底层文件相同,你也会有两个不同的文件句柄。相反,我认为你想要:

    method(:foo) ==  method(:foo2)
    

    如果您尝试一下,您会看到它返回 true

    【讨论】:

      【解决方案2】:

      您在foo 返回的对象上调用object_id,这是在方法中创建的字符串,因此每次都会不同。如果您只调用两次foo,您会看到相同的结果。它每次都返回一个新字符串。如果您想要一个常量字符串,请改为返回符号 :foo

      过去,尽管它们现在共享相同的实现,但它们不同的方法。如果你覆盖foo 以返回字符串“bar”,foo2 仍将继续返回“foo”。

      【讨论】:

      • 是的。我在 foo 返回的对象上调用 object_id。我打算在方法本身上调用 object_id,但我不确定这是否可能或是否有意义。我想通过使用 object_id 来显示 foo 和 foo2 引用相同的方法来揭示这一点。
      【解决方案3】:

      试试:

      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
      

      【讨论】:

      • 不确定我是否理解为什么 FOO 常量具有使 foo 和 foo2 方法引用相同的 object_id 的效果。您的示例产生了我期望的效果,但我不确定为什么需要字符串常量。别名就是别名,不应该是引用同一个对象吗?
      • 不明白为什么您提到“foo”是一个表达式,以及为什么这对于解释这一点很重要。我一定在这里遗漏了一些东西。还是不明白。
      • 我想演示的是 foo 和 foo2 指的是同一个对象。这是我使用 object_id 方法的唯一原因。我认为您的示例有效的原因是因为您要返回一个常量。 foo2.object_id 和 foo.object_id 然后引用同一个对象 - 不像我的例子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 2021-01-01
      • 2012-06-11
      相关资源
      最近更新 更多