alias 和 alias_method都是可以重命名一个方法
区别
1. alias可以重命名全局变量,alias_method不可以
$old_name = 'old'
#注:重命名全局变量只能使用变量名 不能使用符号
alias $new_name $old_name
puts $new_name
=>old
2. 关键字与方法的不同
alias是一个关键字,alias_method是module类的一个方法
使用方法:
alias :new_name old_name
#有逗号
alias_method :new_name, :old_name
3. 参数不同
alias的参数可以是方法名或符号,不能是字符串
alias_method的参数可以是字符串或符号
class Array
alias f1 first
alias :f2 :first
alias_method 'f3', 'first'
alias_method :f4, :first
end
#动态调用方法
%w(f1 f2 f3 f4).each do |f|
puts [1,2,3,4].send(f)
end
=>1
=>1
=>1
=>1
3. 作用域不同
从如下两个例子中可以看出作用域不同,alias是进入原类进行操作,而alias_method是查找当前类同名方法进行操作
class User
def full_name
puts "Johnnie Walker"
end
def self.add_rename
alias_method :name, :full_name
end
end
class Developer < User
def full_name
puts "Geeky geek"
end
add_rename
end
Developer.new.name #=> 'Gekky geek'
class User
def full_name
puts "Johnnie Walker"
end
def self.add_rename
alias :name :full_name
end
end
class Developer < User
def full_name
puts "Geeky geek"
end
add_rename
end
Developer.new.name #=> 'Johnnie Walker'
注:在子类重写父类已经存在的方法时,可以通过alias或alias_method调用旧方法
class OldDemo
def hello
puts 'old hello'
end
end
class NewDemo < OldDemo
#注意alias的位置要在重写方法之前
alias old_hello hello
def hello
puts 'new hello'
end
end
obj = NewDemo.new
obj.hello
=>new hello
obj.old_hello
=>old hellp
注意:不要尝试load多次上述实现代码(不要执行多次上述代码,可以重开窗口执行),结果会和预期不一致,还没细想,如有结论还会更新
网友评论