Aliases

通过使用 alias 关键字,可以给 Ruby 方法取一个别名:

  class MyClass
    def my_method; 'my_method()'; end
    alias :m :my_method
  end

  obj = MyClass.new
  obj.my_method         #=> "my_method()"
  obj.m                 #=> "my_method()"

注意 alias 是一个关键字,而非一个方法,这就是为什么两个方法名之间没有逗号的原因。Ruby 还提供了 Module#alias_method() 方法,它的功能与 alias 关键字相同。

如果先给方法命名一个别名,然后 重定义它,则会把当前存在的这个方法名字跟定义的新方法绑定起来。只要老的方法还存在绑定的名字,仍旧可以调用它

如果新定义的方法会调用老方法,这种技巧被称为 环绕别名。可以通过三个步骤来使用环绕别名:

  1. 给方法定义一个别名。
  2. 重定义这个方法。
  3. 在新的方法中调用老的方法。

环绕别名有两个潜在的陷阱,尽管它们在实际编程中都不太常见:

  • 首先,环绕别名是一种猴子补丁,因此,你可能会破坏已有代码。

  • 第二个潜在问题与加载有关,你永远不该把一个环绕别名加载两次,除非你想在调用这个方法时期望程序崩溃。

Ruby 操作符实际上都是拟态方法,例如,整数的 + 操作符只是名为 Integer#+() 方法的语法糖而已。当写 1 + 1 时,解析器会把它转换为 1.+(1)。

可以使用打开类技术,重定义 Integer#+() 方法:

  class Integer
    alias :old_plus :+

    def +(other)
      self.old_plus(other).old_plus(1)
    end
  end

  1 + 1    #=> 3
  100 + 1  #=> 102