国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

香港云服务器
服務(wù)器之家 - 腳本之家 - Ruby - Ruby的面向?qū)ο蠓绞骄幊虒W(xué)習(xí)雜記

Ruby的面向?qū)ο蠓绞骄幊虒W(xué)習(xí)雜記

2020-05-09 10:17日拱一卒 Ruby

Ruby是具有面向?qū)ο筇匦缘木幊陶Z言,這里整理了一些Ruby的面向?qū)ο蠓绞骄幊虒W(xué)習(xí)雜記,包括類與方法等基本的面向?qū)ο笠氐闹R(shí),需要的朋友可以參考下

打開類

可以重新打開已經(jīng)存在的類并對(duì)之進(jìn)行動(dòng)態(tài)修改,即使像String或者Array這樣標(biāo)準(zhǔn)庫的類也不例外。這種行為方式稱之為打開類(open class)

猴子補(bǔ)丁

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

類與模塊

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

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

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

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

Ruby中的::符號(hào)

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

什么是對(duì)象

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

什么是類

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

load與require方法的異同

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

prepend、include與祖先鏈

祖先鏈用于描述Ruby對(duì)象的繼承關(guān)系,因?yàn)轭惻c模塊是父子關(guān)系,所以祖先鏈中也可以包含模塊,prepend與include分別可以向鏈中添加模塊,不同的是調(diào)用include方法,模塊會(huì)被插入祖先鏈,當(dāng)前類的正上方,而prepend同樣是插入到祖先鏈,但位置其他卻在當(dāng)前類的正下方,另外通過Class.ancestors可以查看當(dāng)前的祖先鏈

private規(guī)則

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

self相關(guān)

調(diào)用一個(gè)方法時(shí),接受者會(huì)扮演self角色 任何沒有明確指定接受者的方法調(diào)用,都當(dāng)做是調(diào)用self的方法 定義一個(gè)模塊(或類)時(shí),該模塊(或類)會(huì)扮演self角色

對(duì)象、類與模塊之間關(guān)系

Ruby的面向?qū)ο蠓绞骄幊虒W(xué)習(xí)雜記

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

動(dòng)態(tài)方法

動(dòng)態(tài)調(diào)用方法

在Ruby中通過Object#send方法可以代替點(diǎn)標(biāo)識(shí)調(diào)用對(duì)象的指定實(shí)例方法

示例代碼
 

?
1
2
3
4
5
6
7
8
9
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

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

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

動(dòng)態(tài)定義方法

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

示例代碼

?
1
2
3
4
5
6
7
8
class MyClass
  define_method :my_method do |my_arg|
    my_arg * 3
  do
end
 
obj = MyClass.new
obj.my_method(2) #=> 6

上面代碼通過define_method方法取代了關(guān)鍵詞def,其本質(zhì)上都是相同的,只是在定義方式上,define_method的方式更加靈活一些,可以通過在編碼中通過推導(dǎo),完成函數(shù)的定義,增加了實(shí)現(xiàn)的靈活性。

method_missing方法

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

method_missing利用的機(jī)制是,當(dāng)一個(gè)對(duì)象進(jìn)行某個(gè)方法調(diào)用的時(shí)候,會(huì)到其對(duì)應(yīng)的類的實(shí)例方法中進(jìn)行查找,如果沒有找到,則順著祖先鏈向上查找,直到找到BasicObject類為止。如果都沒有則會(huì)最終調(diào)用一個(gè)BasicObject#method_missing拋出NoMethodError異常。

當(dāng)我們需要定義很多相似的方法時(shí)候,可以通過重寫method_missing方法,對(duì)相似的方法進(jìn)行統(tǒng)一做出回應(yīng),這樣一來其行為就類似與調(diào)用定義過的方法一樣。

示例代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

動(dòng)態(tài)代理

對(duì)一些封裝過的對(duì)象,通過method_missing方法收集調(diào)用,并把這些調(diào)用轉(zhuǎn)發(fā)到被封裝的對(duì)象,這一過程稱為動(dòng)態(tài)代理,其中method_missing體現(xiàn)了動(dòng)態(tài),轉(zhuǎn)發(fā)體現(xiàn)了代理

const_missing方法

與method_missing類似,還有關(guān)于常量的const_missing方法,當(dāng)引用一個(gè)不存在的常量時(shí),Ruby會(huì)把這個(gè)常量名作為一個(gè)符號(hào)傳遞給const_missing方法。

白板類(blank slates)

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

刪除方法

刪除某個(gè)方法有兩種方式:

  • Module#undef_method
  • Module#remove_method

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

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

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

延伸 · 閱讀

精彩推薦
  • Ruby剖析 Ruby 訪問控制

    剖析 Ruby 訪問控制

    前面,我們說 Ruby 沒有函數(shù),只有方法.而且實(shí)際上有不止一種方法.這一節(jié)我們介紹 訪問控制 (accesscontrols). 想想當(dāng)我們?cè)谧罡邔佣皇窃谝粋€(gè)類的定義里定義...

    ruby教程網(wǎng)3572020-04-08
  • RubyRuby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    這篇文章主要介紹了Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例,建造者模式將一個(gè)復(fù)雜對(duì)象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表...

    范孝鵬2192020-05-07
  • RubyCentOS中配置Ruby on Rails環(huán)境

    CentOS中配置Ruby on Rails環(huán)境

    經(jīng)過一個(gè)上午的折騰,終于把ROR環(huán)境在CentOS中搞定,繞了很多彎路,把文章寫下來總結(jié)一下 ...

    可樂加糖4762020-04-12
  • Ruby簡(jiǎn)要說明Ruby中的迭代器

    簡(jiǎn)要說明Ruby中的迭代器

    這篇文章主要介紹了Ruby中的迭代器,迭代器的概念在動(dòng)態(tài)語言的編程中十分重要,文章中介紹了Ruby中的each迭代器和collect迭代器,需要的朋友可以參考下 ...

    goldensun2772020-04-25
  • RubyRuby環(huán)境下安裝使用bundler來管理多版本的gem

    Ruby環(huán)境下安裝使用bundler來管理多版本的gem

    這篇文章主要介紹了Ruby環(huán)境下安裝使用bundler來管理多版本的gem的方法,舉了Ruby On Rails中的應(yīng)用實(shí)例來進(jìn)行演示,需要的朋友可以參考下 ...

    日拱一卒4332020-05-10
  • RubyRuby簡(jiǎn)潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象

    Ruby簡(jiǎn)潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象

    這篇文章主要介紹了Ruby簡(jiǎn)潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對(duì)象,本文是學(xué)習(xí)筆記第一篇,需要的朋友可以參考下 ...

    腳本之家2472020-04-20
  • RubyRuby迭代器的7種技巧分享

    Ruby迭代器的7種技巧分享

    這篇文章主要介紹了Ruby迭代器的7種技巧分享,Ruby中的迭代器非常人性化,本文既是講解了7個(gè)技巧也是講解了7種迭代器,需要的朋友可以參考下 ...

    腳本之家4782020-04-20
  • RubyRuby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼,數(shù)據(jù)是隨機(jī)的,所以每次的記錄都會(huì)不同。 ...

    ruby教程網(wǎng)2962020-04-10
308
主站蜘蛛池模板: 成人羞羞视频在线看网址 | 日韩在线视频观看 | 欧美日韩一区二区三区在线电影 | 国产精品精品久久久 | 亚洲天堂久久 | 日本看片网站 | 一级毛片一级毛片一级毛片 | 中文字幕视频二区 | 99久久夜色精品国产网站 | 日韩一区二区三区在线视频 | 日韩亚洲一区二区 | 亚洲精品视频在线免费 | 日韩在线播放一区 | 伊人电影综合网 | 亚洲天堂一区在线 | 亚洲国产精品自拍 | 高清视频一区 | 日韩欧美一区二区在线观看 | 久草成人| 亚洲一区视频在线 | 亚洲aⅴ天堂av在线电影软件 | 一级欧美 | 国产人成精品一区二区三 | 黄色国产免费看 | 亚洲久久 | 亚洲自拍偷拍在线 | 国产香蕉视频 | 亚洲网站在线观看 | av在线一区二区 | 亚洲精品久久久久中文字幕欢迎你 | 人人玩人人添人人澡97 | 老女肥熟av免费观看 | www,四虎 | 高清免费在线 | 在线二区 | 国产激情偷乱视频一区二区三区 | 国产精品久久久久久久久久大牛 | 国产美女自拍视频 | 午夜小电影 | 国产一区成人 | 亚洲午夜视频在线观看 |