佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > 在Ruby中查找和執(zhí)行方法

在Ruby中查找和執(zhí)行方法

熱門標(biāo)簽:電話運營中心 硅谷的囚徒呼叫中心 Win7旗艦版 百度AI接口 企業(yè)做大做強 語音系統(tǒng) 呼叫中心市場需求 客戶服務(wù)

當(dāng)調(diào)用一個方法時,Ruby會做兩件事。

1.找到這個方法。這個方法稱為方法查找。

2.執(zhí)行這個方法。為了做到這點,Ruby需要一個叫做self的東西。

這樣的一個過程--發(fā)現(xiàn)一個方法再執(zhí)行之--在每種面向?qū)ο笳Z言中都會發(fā)生。不過,對于像Ruby這樣非常動態(tài)的語言,深入理解這個過程顯得尤為重要。你有沒有好奇過一個方法究竟定義在哪里呢?如果有,那絕對應(yīng)該深入理解方法查找及self。

當(dāng)調(diào)用一個方法時,Ruby會在對象的類中查找那個方法。不過,在給出更復(fù)雜的例子之前,你需要了解兩個新概念:接收者(receiver)和祖先鏈(ancetors chain)。

接收者就是你調(diào)用方法所在的對象。例如,在my_string.reverse()語句中,my_string就是接收者。

為了理解祖先鏈的概念,可以先來觀察任意一個Ruby類。想象從一個類移動到它的超類,然后再移動到超類的超類,依此類推,直到到達(dá)Object類(所有類的默認(rèn)超類),最后來到BasicObject類(Ruby類體系結(jié)構(gòu)的根節(jié)點)。在這個過程中,你所經(jīng)歷的類路徑就是該類的祖先鏈(祖先鏈中還可以包含模塊)。

既然你已經(jīng)知道什么是接受者及祖先鏈了,就可以用一句話來概括方法查找的過程:為了查找一個方法,Ruby首先在接受者的類中查找,然后一層層地在祖先鏈中查找,直到找到這個方法為止。

class MyClass
  def my_method
    my_method()
  end
end
 
class MySubclass MyClass
end
 
obj = MySubclass.new
obj.my_method()              # =>"my_method()"

  當(dāng)調(diào)用my_method()方法時,Ruby會從接收者obj出發(fā),來到MySubclass類。由于在這里不能找到my_method()方法,Ruby向上來到MyClass類,在那里找到了這個方法。

如果在這兒也沒找到這個方法,那么Ruby將會沿著祖先鏈向上來到Object類和BasicObject類。按照大多數(shù)人畫圖的順序,這種查找行為被稱為"向右一步,再向上"規(guī)則。也就是說,先向右一步來到接收者所在的類,然后沿著祖先鏈向上直到找到給定的方法。

到目前為止,我們只關(guān)注于如何找到方法,現(xiàn)在終于要來看看如何執(zhí)行方法了。

設(shè)想你就是Ruby解釋器。若某個人調(diào)用了一個名叫my_method()的方法,你用"向右一步,再向上"的方式找到了這個方法,你發(fā)現(xiàn)這個方法定義如下:
 

def my_method
  temp = @x +1
  my_other_method(temp)    
end

  為了執(zhí)行這個方法,你需要回答兩個問題。首先,實例變量@x屬于哪個對象?其次,你應(yīng)該在哪個對象上調(diào)用方法my_other_method()?

作為具有智慧的人類(而非愚蠢的計算機程序),你很可能憑直覺就能回答這兩個問題:@x實例變量和my_other_method()方法都屬于接收者--那個最初調(diào)用my_method()方法的對象。不過,Ruby可沒有直覺,這對它來說是一個奢侈的東西。當(dāng)調(diào)用一個方法時,Ruby需要持有一個接收者的引用,正是這個引用的存在,它可以記得哪個對象是接收者,再用它來執(zhí)行這個方法。這個接收者引用也可以為你所用。

您可能感興趣的文章:
  • js中style.display=""無效的解決方法
  • JS中style.display和style.visibility的區(qū)別實例說明
  • js style.display=block顯示布局錯亂問題的解決方法

標(biāo)簽:海南 崇左 安康 喀什 山西 山西 長沙 濟南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《在Ruby中查找和執(zhí)行方法》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    惠来县| 青海省| 通城县| 循化| 侯马市| 芦溪县| 牙克石市| 延寿县| 徐闻县| 福海县| 临清市| 两当县| 兴和县| 望谟县| 大城县| 郧西县| 涪陵区| 曲松县| 襄垣县| 白沙| 航空| 扎鲁特旗| 营口市| 乌拉特后旗| 邵阳县| 汉中市| 察隅县| 翁源县| 贵港市| 微山县| 靖宇县| 留坝县| 汕尾市| 永清县| 夹江县| 巴马| 洛阳市| 乌恰县| 凤山市| 武强县| 淮北市|