最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Ruby的面向對象方式編程學習雜記

 更新時間:2016年05月19日 15:31:01   作者:日拱一卒  
Ruby是具有面向對象特性的編程語言,這里整理了一些Ruby的面向對象方式編程學習雜記,包括類與方法等基本的面向對象要素的知識,需要的朋友可以參考下

打開類

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

猴子補丁

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

類與模塊

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

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

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

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

Ruby中的::符號

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

什么是對象

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

什么是類

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

load與require方法的異同

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

prepend、include與祖先鏈

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

private規(guī)則

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

self相關

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

對象、類與模塊之間關系

2016519152625751.jpg (640×462)

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

動態(tài)方法

動態(tài)調用方法

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

示例代碼
 

class MyClass
  def my_method(my_arg)
    my_arg * 2
  end
end

obj = MyClass.new
obj.my_method(3)  #=> 6
obj.send(:my_method, 3) #=> 6

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

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

動態(tài)定義方法

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

示例代碼

class MyClass
  define_method :my_method do |my_arg|
    my_arg * 3
  do
end

obj = MyClass.new
obj.my_method(2) #=> 6

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

method_missing方法

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

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

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

示例代碼

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}"
 end
end

number_of = Roulette.new
puts number_of.bob
puts number_of.kitty

動態(tài)代理

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

const_missing方法

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

白板類(blank slates)

擁有極少方法的類稱為白板類,通過繼承BasicObject類,可以迅速的得到一個白板類。除了這種方法以外,還可以通過刪除方法來將一個普通類變?yōu)榘装孱悺?/p>

刪除方法

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

  • Module#undef_method
  • Module#remove_method

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

動態(tài)方法與Method_missing的使用原則

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

相關文章

  • Ruby中訪問SQL Server數據庫的配置實例

    Ruby中訪問SQL Server數據庫的配置實例

    這篇文章主要介紹了Ruby中訪問SQL Server數據庫的配置實例,本文通過FreeTDS實現,同時介紹了在ActiveRecord上使用Tiny_TDS的技巧,需要的朋友可以參考下
    2014-11-11
  • Ruby的語法和語言特性總結

    Ruby的語法和語言特性總結

    這篇文章主要介紹了Ruby的語法和語言特性總結,包括代碼塊與元編程等Ruby編程中的核心特性,需要的朋友可以參考下
    2016-06-06
  • 深入理解Ruby中的代碼塊block特性

    深入理解Ruby中的代碼塊block特性

    聽到代碼塊這個翻譯,你或許會聯(lián)想到類或者結構體,但block并不是這些東西,這里就帶著大家來深入理解Ruby中的代碼塊block特性
    2016-05-05
  • 艱難完成 nginx + puma 部署 rails 4的詳細記錄

    艱難完成 nginx + puma 部署 rails 4的詳細記錄

    用 Ruby on Rails 寫了個半成品 Limlog 博客系統(tǒng)作為 Rails 練習,花了很長時間想解決部署問題,終于才剛解決。。。
    2014-06-06
  • Ruby中調用執(zhí)行shell命令的6種方法

    Ruby中調用執(zhí)行shell命令的6種方法

    這篇文章主要介紹了Ruby中調用執(zhí)行shell命令的6種方法,本文羅列了Ruby中可以調用和執(zhí)行Linux系統(tǒng)Shell命令的6個方法,需要的朋友可以參考下
    2014-10-10
  • Ruby的面向對象方式編程學習雜記

    Ruby的面向對象方式編程學習雜記

    Ruby是具有面向對象特性的編程語言,這里整理了一些Ruby的面向對象方式編程學習雜記,包括類與方法等基本的面向對象要素的知識,需要的朋友可以參考下
    2016-05-05
  • 舉例講解Ruby中require的使用方法

    舉例講解Ruby中require的使用方法

    這篇文章主要介紹了Ruby中require的使用方法,用其來各種引用文件路徑,需要的朋友可以參考下
    2015-07-07
  • Ruby中的block代碼塊學習教程

    Ruby中的block代碼塊學習教程

    在Ruby中,block并不是類,block可以被轉化為Proc類中衍生出的對象,剛接觸Ruby的話block是很難理解的一個點,接下來就為大家來總結Ruby中的block代碼塊學習教程
    2016-05-05
  • Ruby on Rails中的ActiveRecord編程指南

    Ruby on Rails中的ActiveRecord編程指南

    這篇文章主要介紹了Ruby on Rails中的ActiveRecord編程指南,作者對編寫ActiveRecord的通用習慣給出了建議,需要的朋友可以參考下
    2015-08-08
  • Ruby常用文件操作方法

    Ruby常用文件操作方法

    這篇文章主要介紹了Ruby常用文件操作方法,本文講解了新建文件、讀取文件、刪除、重命名文件、目錄操作等常用文件操作方法,需要的朋友可以參考下
    2015-05-05

最新評論

含山县| 达拉特旗| 搜索| 岗巴县| 平舆县| 攀枝花市| 金坛市| 屏边| 吴江市| 和顺县| 阿尔山市| 栖霞市| 杭锦后旗| 嘉黎县| 浮山县| 五大连池市| 洪泽县| 和平县| 抚州市| 绥江县| 中山市| 务川| 梨树县| 肃北| 北辰区| 鲜城| 白河县| 信宜市| 康平县| 沁阳市| 伊宁县| 乡宁县| 常熟市| 龙岩市| 南京市| 泰兴市| 松桃| 河东区| 盐边县| 科技| 两当县|