亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

Ruby的面向對象方式的詳細介紹

2020-02-24 15:39:41
字體:
來源:轉載
供稿:網友

Ruby是一種具有面向對象特性的編程語言,在這里,武林技術頻道小編整理了Ruby的面向對象方式的詳細介紹,包括一些基本的面向對象元素的知識,有需要的朋友可以參考本文。

打開類

可以重新打開已經存在的類并對之進行動態修改,即使像String或者Array這樣標準庫的類也不例外。這種行為方式稱之為打開類(open class)

猴子補丁

如果你粗心地為某個類添加了新功能,同時覆蓋了類原來的功能,進而影響到其他部分的代碼,這樣的patch稱之為猴子補丁(Monkeypatch)

類與模塊

Ruby的class關鍵字更像是一個作用域操作符,而不是類型聲明語句。class關鍵字的核心任務是把你帶到類的上下文中,讓你可以在里面定義方法。

每個類都是一個模塊,類就是帶有三個方法(new,allocate,superclass)的增強模塊,通過這三個方法可以組織類的繼承結構,并創建對象

Ruby中的類和模塊的概念十分接近,完全可以將二者相互替代,之所以同時保留二者的原因是為了保持代碼的清晰性,讓代碼意圖更加明確。使用原則:

  • 希望把自己代碼包含(include)到別的代碼中,應該使用模塊
  • 希望某段代碼被實例化或被繼承,應該使用類
  • 模塊機制可以用來實現類似其它語言中的命名空間(Namespace)概念

Ruby中的::符號

Ruby中常量的路徑(作用域),類似與文件系統中的目錄,通過::進行分割和訪問,默認直接以::開頭(例: :: Y)表示變量路徑的根位置

什么是對象

對象就是一組實例變量外加一個指向其類的引用。對象的方法并不存在于對象本身,而是存在于對象的類中。

什么是類

類就是一個對象(Class類的一個實例)外加一組實例方法和一個對其超類的引用。Class類是Module類的子類,因此一個類也是一個模塊。

load與require方法的異同

通過load和require都可以進行導入別人的代碼,不同的是load方法用來加載代碼,如果不希望污染當前的命名空間,需要通過load(‘file.rb',true)顯式的要求創建一個匿名模塊來,接管file.rb的常量,require用于導入類庫,此外,就加載次數上load方法每次調用都會再次運行所加載文件,require則對每個庫文件只加載一次。

prepend、include與祖先鏈

祖先鏈用于描述Ruby對象的繼承關系,因為類與模塊是父子關系,所以祖先鏈中也可以包含模塊,prepend與include分別可以向鏈中添加模塊,不同的是調用include方法,模塊會被插入祖先鏈,當前類的正上方,而prepend同樣是插入到祖先鏈,但位置其他卻在當前類的正下方,另外通過Class.ancestors可以查看當前的祖先鏈

private規則

不能通過明確指定接受者來調用私有方法。私有方法只能通過隱性的接受者self調用(Object#send是個例外)

self相關

調用一個方法時,接受者會扮演self角色 任何沒有明確指定接受者的方法調用,都當做是調用self的方法 定義一個模塊(或類)時,該模塊(或類)會扮演self角色

對象、類與模塊之間關系

2016519152625751.jpg (640×462)

上面Module.class指向的也是Class類,可以理解為上面方框內容均為Class,但他們的父子組織關系通過superclass建立并存在異同,可以通過Class.ancestors查看。

動態方法

動態調用方法

在Ruby中通過Object#send方法可以代替點標識調用對象的指定實例方法

示例代碼
?

ruby;">class MyClass  def my_method(my_arg)    my_arg * 2  endendobj = MyClass.newobj.my_method(3)  #=> 6obj.send(:my_method, 3) #=> 6

上面代碼通過直接調用和使用send方法調用得到的結果是一樣的,使用send的好處是,可以在編碼中,動態的決定方法調用。這個技巧在元編程中被稱為動態派發

另外需要指出的地方是通過Object#send不僅可以調用公共方法,也可以調用對象的私有方法。如果想保留對象的封裝特性,不向外暴露私有方法可以使用Object#public_send方法。

動態定義方法

除了方法的動態調用之外,Ruby還通過Module#define_method方法和代碼塊提供了動態方法定義方式

示例代碼

class MyClass  define_method :my_method do |my_arg|    my_arg * 3  doendobj = MyClass.newobj.my_method(2) #=> 6

上面代碼通過define_method方法取代了關鍵詞def,其本質上都是相同的,只是在定義方式上,define_method的方式更加靈活一些,可以通過在編碼中通過推導,完成函數的定義,增加了實現的靈活性。

method_missing方法

嚴格意義上將method_missing方法,并不算是明確的定義(不會出現在methods列表中),其本質是通過方法查找的機制來截獲調用信息進而合理的給出相應方法的回應。有點類似與異常處理中的拋出異常,一層一層的往外拋。

method_missing利用的機制是,當一個對象進行某個方法調用的時候,會到其對應的類的實例方法中進行查找,如果沒有找到,則順著祖先鏈向上查找,直到找到BasicObject類為止。如果都沒有則會最終調用一個BasicObject#method_missing拋出NoMethodError異常。

當我們需要定義很多相似的方法時候,可以通過重寫method_missing方法,對相似的方法進行統一做出回應,這樣一來其行為就類似與調用定義過的方法一樣。

示例代碼

class Roulette def method_missing(name, *args)  person = name.to_s.capitalize  super unless %w[Bob Frank Bill Honda Eric].include? person  number = 0  3.times do   number = rand(10) + 1   puts "#{number}..."  end  "#{person} got a #{number}" endendnumber_of = Roulette.newputs number_of.bobputs number_of.kitty

動態代理

對一些封裝過的對象,通過method_missing方法收集調用,并把這些調用轉發到被封裝的對象,這一過程稱為動態代理,其中method_missing體現了動態,轉發體現了代理

const_missing方法

與method_missing類似,還有關于常量的const_missing方法,當引用一個不存在的常量時,Ruby會把這個常量名作為一個符號傳遞給const_missing方法。

白板類(blank slates)

擁有極少方法的類稱為白板類,通過繼承BasicObject類,可以迅速的得到一個白板類。除了這種方法以外,還可以通過刪除方法來將一個普通類變為白板類。

刪除方法

刪除某個方法有兩種方式:

  • Module#undef_method
  • Module#remove_method

二者的區別是Module#undef_method會刪除所有(包括繼承而來的)方法。而Module#remove_method只刪除接受者自己的方法,而保留繼承來的方法。

動態方法與Method_missing的使用原則

當可以使用動態方法時候,盡量使用動態方法。除非必須使用method_missing方法(方法特別多的情況),否則盡量少使用它。

Ruby的面向對象方式的詳細介紹,現在大家都有了大概的認識了吧,武林技術頻道小編將繼續和大家分享。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人h视频在线| 日韩av色在线| 国产黑人绿帽在线第一区| 久久成人精品视频| 在线视频欧美日韩精品| 欧美成人一二三| 69国产精品成人在线播放| 亚洲区中文字幕| 岛国av一区二区在线在线观看| 日韩中文字幕久久| 日本一区二三区好的精华液| 日本成人在线视频网址| 国产精品美女无圣光视频| 国产精品视频99| 精品国产拍在线观看| 亚洲精品乱码久久久久久金桔影视| 国产视频福利一区| 日韩av在线免费看| 亚洲韩国青草视频| 国产国产精品人在线视| 亚洲国产成人久久综合| 中文字幕欧美亚洲| 久久亚洲精品小早川怜子66| 亚洲精品资源美女情侣酒店| 欧美日韩国产一区中文午夜| 91精品视频在线看| 亚洲在线免费视频| 国产精品欧美亚洲777777| 免费91在线视频| 亚洲精品动漫久久久久| 日韩国产欧美区| 中文字幕日韩在线视频| 一区二区成人精品| 不卡av电影院| 日韩中文字幕不卡视频| 国产午夜精品视频免费不卡69堂| 亚洲激情视频网| 大桥未久av一区二区三区| 亚洲香蕉在线观看| 精品福利视频导航| 国产一区二区三区在线看| 国产亚洲成av人片在线观看桃| 国产精品久久久久久av下载红粉| 欧美性高潮床叫视频| 麻豆一区二区在线观看| 久久福利视频导航| 日韩在线中文字幕| 国产精品高潮在线| 国产精品免费小视频| 国模精品视频一区二区三区| 日本一欧美一欧美一亚洲视频| 91成人天堂久久成人| 久久精品99久久久香蕉| 2019精品视频| 久久久91精品国产一区不卡| 中文字幕亚洲无线码a| 欧美激情在线观看视频| 日韩精品亚洲视频| 亚洲三级 欧美三级| 亚洲欧美在线看| 亚洲成色777777在线观看影院| 国产精品久久色| 国产精品视频永久免费播放| 国产精品久久不能| 久久97精品久久久久久久不卡| 国产极品精品在线观看| 成人激情在线观看| 日韩有码在线视频| 欧美亚洲免费电影| 欧美一级电影在线| 岛国精品视频在线播放| 最好看的2019年中文视频| 午夜免费在线观看精品视频| 成人a视频在线观看| 另类专区欧美制服同性| 在线观看国产精品淫| 国产视频精品xxxx| 欧美一区二粉嫩精品国产一线天| 欧美日韩国产综合视频在线观看中文| 日韩免费观看网站| 国语自产精品视频在免费| 欧美视频在线观看免费网址| 亚洲第一网站男人都懂| 色先锋久久影院av| 福利一区视频在线观看| 日韩黄色在线免费观看| 综合国产在线视频| 日韩国产欧美区| 91情侣偷在线精品国产| 国产精品视频久久久久| 日韩一区二区三区在线播放| 欧美激情国产高清| 久久伊人色综合| 久久久久久久久网站| 亚洲综合色激情五月| 国产精品久久综合av爱欲tv| 国产在线日韩在线| 亚洲欧美中文日韩在线| 欧美亚洲伦理www| 欧美理论电影在线播放| 日韩av在线免播放器| 91a在线视频| 亚洲美女性生活视频| 欧日韩在线观看| 欧美不卡视频一区发布| 亚洲欧美成人一区二区在线电影| 国产在线观看91精品一区| 久久精品国产亚洲| 精品人伦一区二区三区蜜桃网站| 91在线中文字幕| 欧美肥老太性生活视频| 91国产高清在线| 亚洲一区二区三区四区视频| 日韩精品视频免费在线观看| 国产精品入口日韩视频大尺度| 精品国产一区二区三区久久| 亚洲无限乱码一二三四麻| 国产福利视频一区二区| 亚洲欧美成人一区二区在线电影| 欧美亚洲成人网| 亚洲2020天天堂在线观看| 国产亚洲欧洲黄色| 欧美精品在线极品| 精品香蕉在线观看视频一| 国产精品久久久久久婷婷天堂| 亚洲美女www午夜| 4p变态网欧美系列| 午夜精品福利电影| 日韩经典中文字幕在线观看| 欧美激情一二三| 久久久国产精彩视频美女艺术照福利| 在线视频国产日韩| www.99久久热国产日韩欧美.com| 97人洗澡人人免费公开视频碰碰碰| 日韩视频亚洲视频| 国产精品扒开腿做爽爽爽视频| 欧美激情一区二区三区高清视频| 国产精品第二页| 欧美成人午夜影院| 尤物九九久久国产精品的分类| 日韩欧美在线中文字幕| 欧美一区深夜视频| 亚洲专区中文字幕| 欧美成人在线网站| 久久久久中文字幕2018| 欧美国产日本在线| 最近2019中文字幕第三页视频| 日本一区二三区好的精华液| 成人黄色激情网| 欧美极度另类性三渗透| 欧美另类极品videosbest最新版本| 亚洲人成电影网站色xx| 国产精品户外野外| 成人在线精品视频| 亚洲一区久久久| 亚洲第一区第一页| 亚洲图片制服诱惑| 亚洲另类图片色| 欧美乱大交xxxxx| 97在线观看视频| 欧美午夜精品久久久久久久| 国产精品美女午夜av| 国产亚洲人成a一在线v站| 色综合亚洲精品激情狠狠|