ruby學習筆記(9)-別名(alias)與方法取消(undef,remove_method)

來源:互聯網
上載者:User

先來看別名,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方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.