Ruby元编程读书笔记十六
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 关键字相同。
如果先给方法命名一个别名,然后 重定义它,则会把当前存在的这个方法名字跟定义的新方法绑定起来。只要老的方法还存在绑定的名字,仍旧可以调用它。
如果新定义的方法会调用老方法,这种技巧被称为 环绕别名。可以通过三个步骤来使用环绕别名:
- 给方法定义一个别名。
- 重定义这个方法。
- 在新的方法中调用老的方法。
环绕别名有两个潜在的陷阱,尽管它们在实际编程中都不太常见:
-
首先,环绕别名是一种猴子补丁,因此,你可能会破坏已有代码。
-
第二个潜在问题与加载有关,你永远不该把一个环绕别名加载两次,除非你想在调用这个方法时期望程序崩溃。
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