先來看別名,ruby中可以給方法或全域變數起一個別名,有意思的是:方法別名定義後,即使對應的方法在後面的代碼中重新定義(即修改內部實現)後,別名仍然可以調用到修改前的方法,而全域變數則不行。
def meth puts "This is meth"endalias:orgin_meth:methmeth #=> This is methorgin_meth #=>This is methdef meth puts "a new meth"endmeth #=> a new methorgin_meth #=> This is meth (注意這裡仍保留老方式的特性)$a = 1alias $b $a #將全域變數a,另取個別名b$b = 2p $a,$b #=> 2,2 (注意這也方法別名的不同)
再來說說方法取消:
利用undef或undef_method,可以將類的方法取消定義(也可以理解為徹底刪除掉),這沒什麼不好理解,但要注意的是:如果一個類繼承自父類,並且又定義了與父類同名的方法,用undef取消該方法後,將連帶父類的同名方法一起取消(其實也很正常:動態語言世界裡,子類重定義了父類繼承得來的重名方法,相當於覆寫了該方法,所以子類執行個體調用時也只能調用到子類自身的同名方法,一旦取消後,該方法[不管是父類的,還是子類的]將與子類再無任何牽掛)
class Base def meth puts "Base.meth" endendclass SubClass1 < Base def meth #相當於重寫了父類的meth方法 puts "SubClass1.meth" end def meth2 puts "SubClass1.meth2" end ends1 = SubClass1.news1.meth #=>SubClass1.meths1.meth2 #=>SubClass1.meth2class SubClass1 undef:meth2 #undef_method(:meth2) #這句話與上面的等效 undef:meth # 注意這裡:取消meth的定義後,連父類繼承的meth也將無法調用 end#s1.meth #將報錯
如果我們只想取消子類中的方法,而保留父類繼承得來的同名方法,怎麼辦?答案就是:remove_method,把上一段代碼的最後部分改成:
class SubClass1 undef:meth2 #undef_method(:meth2) #這句話與上面的等效 remove_method(:meth) #僅移除子類的meth方法ends1.meth #=> Base.meth
可以看到,調用s1.meth時,使用的是父類的meth方法