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

首頁 > 編程 > Ruby > 正文

Ruby面向對象編程的學習方法

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

Ruby是一種具有面向對象特性的編程語言,今天在這里,武林技術頻道小編整理了Ruby面向對象編程的學習方法,需要這些知識是朋友就跟隨武林技術頻道小編的步伐來學習一下吧!

打開類和猴子補丁
在Ruby中,類定義的方法和其他的語句沒有任何區別,都是一行一行的執行下去的。如下例子:

ruby;">class Example  def method_1   puts "method 1"  end end class Example  def method_2   puts "method 2"  end end 

本例中,當第一次定義Class Example的時候,還沒有一個叫做Example的Class存在,因此,Ruby開始定義這個類,當后面在定義這個類時,Ruby會發現該類已存在,并返回這個類,而不是定義一個新類。

因為這個特性,因此,Ruby天生具有打開一個已經存在的類,并動態修改其內容的能力,即使其是標準類庫的類也不例外。比方說,可以給SDK的String類添加一個去除String中的標點符號和特殊字符的方法:to_alphanumeric

class String  def to_alphanumeric   gsub /[^/w/s]/, ''  end end “H&&^^ello”.to_alphanumeric #==>Hello 

,然后,所有的String對象都具備“to_alphanumeric”的能力了,這種技術一般簡稱為打開類技術。

上面描述的打開類技術其實是隱含了一定的風險的,尤其是在大型系統中使用打開類技術擴展標準類庫時,因為,很多開發人員都在擴展類,當多個擴展方法的名字一樣時, 后定義的總會覆蓋掉前面,從而導致整個系統的崩潰,業界把這種魯莽的修改類的方式簡稱為猴子補丁(Monkey Patch)。因此在使用打開類技術時,一定要慎之又慎。

實例變量
在Ruby中,實例變量是存儲在對象中,但是,其于該對象的類沒有關系,當給對象的實例變量賦值時,該實例變量就生成了,說白了,實例變量就像是一個掛載在對象上的HashMap,每個對象都可以用自己不同的HashMap, 如下例:

class Person  def name   @name = "xianlinbox"  end end p = Person.new puts p.instance_variables   #==>nil p.name puts p.instance_variables   #==>@name 

方法
作為一個對象,除了有實例變量(也可以稱之為屬性),還需要有方法。 但是在Ruby中,關于方法的定義并不在對象中,而是在對象自身的類中,這是因為“共享同一個類的對象也必須共享同樣的方法”。但是,不能說Class有一個叫做“method”的方法,因為無法使用"Class.method"調用該方法,而要說Class有一個實例方法“method”,這意味著必須創建該類的實例對象,通過實例對象調用該方法。

如果要定義類方法,那么在定義方法的時候,必須加類名前綴,如下:

class Person  def Person.name   @name = "xianlinbox"  end end 

類本身也是對象
在Ruby中Class本身也是一個對象,關于對象的所有規則都適用于Class.

puts "hello".class          #=> String puts String.class           #=> Class puts Class.class           #=> Class puts Class.instance_methods(false)  #=> [:superclass,:allocate,:new] puts Class.instance_variables    #=> nil 

類的繼承體系

puts String.superclass    #=> Object  puts Class.superclass     #=> Module puts Module.superclass    #=> Object puts Object.superclass    #=> BasicObjec puts BasicObject.superclass  #=> nil 

BasicObject是繼承體系的根節點。
所有類都繼承自Object。
Class是對Module的繼承增強,增加了new()和allocate()方法以創建實例。

方法的查找與執行
Ruby中對象的方法都定義在類中,當對象想要執行一個方法時,首先需要找到該方法,而Ruby編譯器查找方法的方式就是,第一步在自己的類中找,沒有的話,就沿著該類的祖先鏈(ancestors)一直往上找。

String.ancestors    # => [String, Comparable, Object, Kernel, BasicObject] 

為什么這兒會出現Comparable和Kernal, 這是因為Module的機制,當一個類include一個模塊時,編譯會把該模塊放在最靠近該類的祖先鏈上, String類include了Comparable模塊,而Kernal則是被Object類include的。

方法執行的時候需要一個接收者,方法就會在接收者對象中被執行,該接收者就是所謂的self對象。一般情況下,self對象是由最后一個接收該方法的對象擔當,在類和模塊的定義中(并且在任何方法的定義外),self對象由類或模塊擔任。

動態調用方法
通常方法的調用方式是“對象名.方法名”,在Ruby中有一個很酷的特性,可以通過send()方法,把想調用的方法名作為參數,這樣就可以在代碼運行時,直到最后時刻才決定調用哪個方法,這種技術稱之為動態派發(Dynamic Dispatch)。這個技術非常有用,比方說,當在項目中有一個配置文件對象,會根據配置文件初始化,在使用過程中,不同用戶可能會設置不同的值。通常做法是,判斷屬性的鍵值是對應到哪個屬性,然后,調用對應的set方法,代碼如下:

config.name = v if isNameProperty?(k)  config.password = v if isPasswordProperty?(k)  config.port = v if isPortProperty?(k)  ...  

看著這么一堆的長得像親兄弟似的代碼,不由得產生一種閹掉它們的沖動。如果使用動態調用方法的話,代碼可以簡化如下:

load_config('config.properties').each do |k, v|  config.send("#{k}=", v)  end 

?根據獲取的每個鍵值,去調對應屬性的set方法,代碼清爽很多,而且以后擴展config對象不需要修改load方法。

動態定義方法
除了動態調用方法外,Ruby甚至支持動態定義方法,通過使用Module#define_method()方法,提供一個方法名和一個充當方法體的塊即可定義一個方法。例:

class MyClass  define_method :doubleString do |args|  args * 2  end  end  t = MyClass.new  puts t.doubleString("he")  # => hehe 

有了這個黑魔法之后,以后,就可以多個相似方法中不同的部分抽出來作為參數,然后,使用一個方法定義搞定所有的方法。

method_missing()方法
Ruby是動態語言,編譯器并不會檢測方法調用時的行為,因此你可以調用一個不存在的方法。 在運行時,所有找不到對應方法的調用都會調用一個method_missing()方法,該方法定義在Kernal模塊中,因此每個對象都繼承了該方法。在kernal中method_missing()方法,會拋出一個NoMethodError的異常,這就是編譯器所做的工作。

但是,我們可以覆寫這個方法,讓它變得很有意思。比方說,創建一個Struct,當你想要新的屬性時,只需要給它賦個值就神奇的產生了。

class MyStruct  def initialize  @attributes = {}  end   def method_missing(name, *args)  attribute = name.to_s  if attribute =~ /=$/  @attributes[attribute.chop] = args[0]  else  @attributes[attribute]  end  end  end  s = MyStruct.new  s.weibo = "@xianlinbox"  puts s.weibo       # => @xianlinbox 

這種,從調用者角度看,跟普通方法沒什么區別,但是實際接收者卻并沒有相對應的方法的方法,Ruby術語稱之為幽靈方法(Ghost Method)。對于幽靈方法,除了自定義該方法以外,還可以把該方法轉發給另外一個對象的方法,當然,你可以在轉發前后包裝一些自己的邏輯,這種處理技術稱之為動態代理(Dynamic Proxy),和前面提到的動態調用異曲同工。

使用了method_missing處理幽靈方法后,所有不存在方法的調用都會到這里來,這可能會導致一些錯誤信息不直觀的問題(你看不到NoSuchMethod這樣的提示了),因此, 在使用method_missing方案的時候,一定要限定其使用范圍,并且調用父類的super.method_missing方法,讓不屬于這個范圍的,該報什么錯還是報什么錯。

白板類與保留方法
每一個類都有從父類繼承下來的一堆方法,在使用動態代理技術時,如果一個幽靈方法和真實的方法(你沒有意料到的繼承來的方法)發生名字沖突時,后者會獲勝,從而導致系統報錯。因此在使用動態代理技術時, 可以在代理類中刪除絕大多數繼承來的方法,避免發生名字沖突,刪除了繼承方法的類,就是所謂的白板類(Blank Slate),刪除類方法的途徑有2個,一個是調用Module#undef_method方法,一個是調用Module#remove_method方法。

在Ruby的Object類中,有一些方法是內部使用的,如果對其重新定義,或刪除,可能導致Ruby莫名其妙的掛掉,為了防止這種事情的發生,Ruby在這些方法名前面用“__”打頭,這些方法稱之為保留方法,當你試圖修改這些方法時,Ruby會給出警告。

Ruby面向對象編程的學習方法為各位朋友們總結完畢了,大家看完之后,是不是掌握了呢?感謝大家繼續對武林技術頻道網的支持。

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久人体大胆视频| 国产91成人在在线播放| 97免费中文视频在线观看| 自拍偷拍免费精品| 亚洲在线视频观看| 91在线免费网站| 国产精品久久婷婷六月丁香| 欧美国产第二页| 国产日本欧美一区二区三区| 亚洲国产精品美女| 欧美日韩精品在线视频| 国产精品久久久久9999| 久久精品一区中文字幕| 久久久久久伊人| 久久视频在线观看免费| 亚洲成人免费网站| 久久久999成人| 亚洲理论片在线观看| 精品国产乱码久久久久久天美| 中文字幕久久久| 日韩免费观看视频| 欧美最猛性xxxx| 亚洲最新视频在线| 中文字幕日韩在线播放| 欧美成人全部免费| 97视频在线观看播放| 日本韩国在线不卡| 国语对白做受69| 国内揄拍国内精品| www.xxxx精品| 亚洲美女激情视频| 亚洲一区二区中文字幕| 亚洲国产另类 国产精品国产免费| 一区二区三区视频免费在线观看| 国产一区二区av| 激情久久av一区av二区av三区| 91视频国产高清| 欧美激情xxxx| 欧美xxxx14xxxxx性爽| 日韩www在线| 97香蕉久久夜色精品国产| 欧美国产高跟鞋裸体秀xxxhd| 亚洲一区中文字幕| 欧美在线视频播放| 亚洲图中文字幕| 中文字幕久精品免费视频| 国产精品69久久| 欧美巨猛xxxx猛交黑人97人| 成人黄色午夜影院| 亚洲午夜久久久影院| 亚洲欧美综合图区| 亚洲第一精品福利| 欧美一级视频在线观看| 欧美成人在线网站| 秋霞成人午夜鲁丝一区二区三区| 成人a免费视频| 欧美成人在线免费| 精品国偷自产在线视频| 91九色国产视频| 亚洲黄色免费三级| 欧美成人免费大片| 亚洲精品网站在线播放gif| 久久久久久中文| 成人亚洲综合色就1024| 欧美精品激情在线| 国产精品久久久久久中文字| 中文字幕欧美亚洲| 亚洲色图综合久久| 亚洲最大福利网站| 国产精品高潮呻吟久久av野狼| 久久久在线免费观看| 97在线视频观看| 91大神在线播放精品| 国产一区二区动漫| 国产精品福利在线| 亚洲精品久久久久久久久久久久久| 日韩视频免费中文字幕| 高清一区二区三区四区五区| 亚洲欧美日本精品| 最近2019免费中文字幕视频三| 91精品久久久久久| 国产精品尤物福利片在线观看| 中文字幕国产精品久久| 午夜精品一区二区三区视频免费看| 欧美放荡办公室videos4k| 国产精品日日做人人爱| 日本国产一区二区三区| 夜夜狂射影院欧美极品| 国产精品wwww| 91夜夜揉人人捏人人添红杏| 一本一本久久a久久精品牛牛影视| 亚洲第一福利网| 欧美丝袜美女中出在线| 国产精品黄视频| 亚洲激情视频在线| 国产精品久久91| 欧美富婆性猛交| 国产精品wwww| 亚洲成人精品在线| 日韩av在线高清| 亚洲欧美国产一区二区三区| 91国内揄拍国内精品对白| 久久久免费av| 欧美激情乱人伦| 国产成人精品亚洲精品| 欧美性做爰毛片| 国产精品欧美日韩一区二区| 97视频在线免费观看| 国产精品久久久久影院日本| 亚洲欧美综合精品久久成人| 国产中文字幕亚洲| 高清一区二区三区四区五区| 日韩av中文字幕在线免费观看| 日韩免费av在线| 久久久精品久久久| 综合国产在线视频| 亚洲精品不卡在线| 中文欧美日本在线资源| 久久99国产精品久久久久久久久| 日韩精品在线第一页| 91精品国产自产在线观看永久| 欧美乱大交做爰xxxⅹ性3| 欧美日韩国产丝袜另类| 国产精品黄色影片导航在线观看| 欧美精品一区二区三区国产精品| 欧美性猛交xxxx乱大交极品| 欧美美女15p| 深夜精品寂寞黄网站在线观看| 欧美激情国产日韩精品一区18| 国产精品久久久一区| 亚洲精品国产成人| 九九热精品视频在线播放| 日本亚洲精品在线观看| 91免费看片在线| 亚洲一区二区三区视频| www.日韩av.com| 欧美夫妻性生活视频| 日韩性生活视频| 日韩欧美国产一区二区| 韩国19禁主播vip福利视频| 久青草国产97香蕉在线视频| 91精品国产91久久久久| 黄色一区二区三区| 欧美精品做受xxx性少妇| 最近中文字幕mv在线一区二区三区四区| 欧美理论电影网| 亚洲wwwav| 精品少妇一区二区30p| 3344国产精品免费看| 久久影视电视剧免费网站| 久久精品国产99国产精品澳门| 国产精品久久久久7777婷婷| 一本色道久久88精品综合| 国产精品久久久久久av| 亚洲精品电影久久久| 日韩中文在线不卡| 美女av一区二区三区| 国产91久久婷婷一区二区| 欧美日韩国产一区二区三区| 九色成人免费视频| 国产精品久久久久久中文字| 色爱av美腿丝袜综合粉嫩av| 国产成人福利夜色影视| 欧美日韩亚洲激情|