ZetCode

Ruby 别名关键字

最后修改日期:2025 年 4 月 27 日

本教程解释了如何使用 Ruby 的 alias 关键字创建方法别名。方法别名提供了现有方法的替代名称。

alias 关键字为现有方法创建一个新名称。原始方法仍然可访问。别名是永久性的,会影响所有调用。

别名对于向后兼容性、可读性或方法增强很有用。它同时适用于实例方法和类方法。别名可以在类或模块内部定义。

基本方法别名

此示例显示了 alias 创建替代方法名称的最简单用法。两个名称都指向相同的实现。

basic_alias.rb
class Greeter
  def hello
    puts "Hello!"
  end
  
  alias hi hello
end

g = Greeter.new
g.hello  # => "Hello!"
g.hi     # => "Hello!"

hi 方法成为 hello 的精确副本。两个方法都可以互换调用。别名对所有实例都有效。

别名内置方法

Ruby 允许别名内置方法。此示例为 puts 方法创建了一个更具可读性的名称。

builtin_alias.rb
alias say puts

say "This works like puts"
say 1, 2, 3

say 别名与 puts 的工作方式完全相同,接受多个参数。全局别名会影响整个程序范围。

模块上下文中的别名

在模块内部使用时,alias 会影响所有包含该模块的类。这演示了模块方法别名。

module_alias.rb
module Logging
  def log(message)
    puts "[LOG] #{message}"
  end
  
  alias record log
end

class Service
  include Logging
end

s = Service.new
s.log("Starting service")    # => "[LOG] Starting service"
s.record("Service started") # => "[LOG] Service started"

logrecord 方法都可以被包含 Logging 模块的任何类使用。别名在模块级别工作。

使用别名进行方法增强

一种常见的模式是使用 alias 在增强行为时保留原始方法。此示例为现有方法添加日志记录。

augmentation.rb
class Calculator
  def add(x, y)
    x + y
  end
end

class EnhancedCalculator < Calculator
  alias original_add add
  
  def add(x, y)
    puts "Adding #{x} and #{y}"
    original_add(x, y)
  end
end

calc = EnhancedCalculator.new
puts calc.add(3, 4)  # Logs and returns 7

原始的 add 方法被保留为 original_add。新版本添加了日志记录,同时保持了相同的接口。

带参数的别名

方法别名保留所有原始参数。此示例展示了具有不同参数模式的方法的别名。

parameters.rb
class Formatter
  def format_name(first, last)
    "#{first} #{last}"
  end
  
  alias full_name format_name
  
  def format_date(year, month=1, day=1)
    "#{year}-#{month}-#{day}"
  end
  
  alias date full_date=format_date
end

f = Formatter.new
puts f.full_name("John", "Doe")  # => "John Doe"
puts f.date(2025)                # => "2025-1-1"

必需参数和可选参数都可以正确地与别名一起使用。别名保留与原始方法完全相同的签名。

动态别名

Ruby 允许使用 alias_method 动态创建别名。此示例展示了基于条件的运行时方法别名。

dynamic.rb
class DynamicAlias
  def greet
    puts "Hello!"
  end
  
  def self.create_alias(new_name)
    alias_method new_name, :greet
  end
end

DynamicAlias.create_alias(:welcome)
DynamicAlias.create_alias(:salute)

obj = DynamicAlias.new
obj.welcome  # => "Hello!"
obj.salute   # => "Hello!"

create_alias 类方法在运行时生成新的别名。此技术对于元编程场景很有用。

别名链和 super

别名可以与继承和 super 一起正确工作。此示例演示了通过别名进行方法链式调用。

inheritance.rb
class Parent
  def process
    puts "Parent processing"
  end
end

class Child < Parent
  alias parent_process process
  
  def process
    puts "Child preprocessing"
    parent_process
    puts "Child postprocessing"
  end
end

Child.new.process

输出显示了完整的调用链:子类的预处理、父类的处理和子类的后处理。别名保持了正确的继承关系。

来源

Ruby 关键字文档

本教程涵盖了 Ruby 的 alias 关键字,并通过示例展示了基本用法、方法增强、动态别名和继承模式。

作者

我的名字是 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有超过十年的经验。

列出 所有 Ruby 教程