回到Ruby系列文章


alias和alias_method

alias关键和alias_method方法都可以用来给方法取别名。

1
2
3
4
5
6
7
8
9
10
11
def m1
xxx
end

# m1是旧方法,m2或m3是新方法
alias m2 m1
alias_method m3, m1

# 或使用Symbol的方式
alias :m2 :m1
alias_method :m3, :m1

但它们有区别:

  1. alias是关键字,方法之间空格隔开,alias_method是方法,两方法作为参数,之间使用逗号隔开
  2. alias可用于任何上下文,而alias_method只能用在class/module关键字内部
  3. alias是词法作用域,定义在哪里就看到哪里的方法定义内容,alias_method是动态作用域,取决于运行时看到的方法定义内容

使用建议:更多时候建议使用alias_method,因为它定义的方法别名具有多态效应,比如子类重写旧方法后,调用新方法时可以调用到重写后的旧方法

例如,下面alias_method定义在class内部,而alias既可以在class/module内部,还可以在class外面甚至在对象内部。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# alias_method定义在class或module内部
class User
def full_name
puts "junmajinlong"
end
alias_method :name, :full_name
end
User.new.name

# alias可以在class/module内部,也可以在外面
class User1
def full_name
puts "junmajinlong"
end
alias name full_name
end
User1.new.name

def full_name
puts "junmajinlong"
end
alias name full_name
name

下面是aliasalias_method上下文的区别:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# alias_method是动态作用域,运行时看到的full_name是什么就是什么
class User
def full_name
puts "junmajinlong"
end
def self.add_alias
alias_method :name, :full_name
end
end

class Teacher < User
def full_name
puts "teacher junmajinlong"
end
add_alias
end
Teacher.new.name # teacher junmajinlong

# alias是词法作用域,定义时看到的full_name是什么就是什么
class User1
def full_name
puts "junmajinlong"
end
def self.add_alias
alias name full_name
end
end

class Teacher1 <User1
def full_name
puts "teacher junmajinlong"
end
add_alias
end

Teacher1.new.name # "junmajinlong"