alias 和 alias_method都是可以重命名一個方法
區(qū)別
1. alias可以重命名全局變量,alias_method不可以
$old_name = 'old'
#注:重命名全局變量只能使用變量名 不能使用符號
alias $new_name $old_name
puts $new_name
=>old
2. 關(guān)鍵字與方法的不同
alias是一個關(guān)鍵字,alias_method是module類的一個方法
使用方法:
alias :new_name old_name
#有逗號
alias_method :new_name, :old_name
3. 參數(shù)不同
alias的參數(shù)可以是方法名或符號,不能是字符串
alias_method的參數(shù)可以是字符串或符號
class Array
alias f1 first
alias :f2 :first
alias_method 'f3', 'first'
alias_method :f4, :first
end
#動態(tài)調(diào)用方法
%w(f1 f2 f3 f4).each do |f|
puts [1,2,3,4].send(f)
end
=>1
=>1
=>1
=>1
3. 作用域不同
從如下兩個例子中可以看出作用域不同,alias是進入原類進行操作,而alias_method是查找當(dāng)前類同名方法進行操作
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'
注:在子類重寫父類已經(jīng)存在的方法時,可以通過alias或alias_method調(diào)用舊方法
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多次上述實現(xiàn)代碼(不要執(zhí)行多次上述代碼,可以重開窗口執(zhí)行),結(jié)果會和預(yù)期不一致,還沒細(xì)想,如有結(jié)論還會更新