欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2015年07月13日 15:22:15   投稿:goldensun  
這篇文章主要介紹了在Ruby中查找和執(zhí)行方法,是Ruby入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下

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

1.找到這個(gè)方法。這個(gè)方法稱為方法查找。

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

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

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

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

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

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

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()方法時(shí),Ruby會(huì)從接收者obj出發(fā),來(lái)到MySubclass類。由于在這里不能找到my_method()方法,Ruby向上來(lái)到MyClass類,在那里找到了這個(gè)方法。

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

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

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

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

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

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

相關(guān)文章

  • Ruby中字符串左側(cè)補(bǔ)零方法實(shí)例

    Ruby中字符串左側(cè)補(bǔ)零方法實(shí)例

    這篇文章主要介紹了Ruby中字符串左側(cè)補(bǔ)零方法實(shí)例,常用的方法是使用字符的rjust方法來(lái)實(shí)現(xiàn),需要的朋友可以參考下
    2014-06-06
  • 提升Ruby on Rails性能的幾個(gè)解決方案

    提升Ruby on Rails性能的幾個(gè)解決方案

    這篇文章主要介紹了提升Ruby on Rails性能的幾個(gè)解決方案,本文來(lái)自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下
    2015-04-04
  • 使用C++來(lái)編寫Ruby程序擴(kuò)展的教程

    使用C++來(lái)編寫Ruby程序擴(kuò)展的教程

    這篇文章主要介紹了使用C++來(lái)編寫Ruby程序擴(kuò)展的教程,本文來(lái)自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下
    2015-04-04
  • Rails link_to 詳解

    Rails link_to 詳解

    想學(xué)習(xí)rauks link_to的朋友可以參考下面的例子。
    2008-12-12
  • Ruby面向?qū)ο缶幊讨蓄惻c方法的基礎(chǔ)學(xué)習(xí)

    Ruby面向?qū)ο缶幊讨蓄惻c方法的基礎(chǔ)學(xué)習(xí)

    方法可以理解為類中的函數(shù),一定程度上可以受到類作用域的制約,其他地方和傳統(tǒng)意義上的函數(shù)無(wú)太大區(qū)別,這里我們就一起來(lái)進(jìn)行Ruby面向?qū)ο缶幊讨蓄惻c方法的基礎(chǔ)學(xué)習(xí)
    2016-05-05
  • CentOS7下搭建ruby on rails開發(fā)環(huán)境

    CentOS7下搭建ruby on rails開發(fā)環(huán)境

    聽說(shuō)rails是一個(gè)比較流行的快速開發(fā)框架,對(duì)于我這個(gè)web不熟悉的人來(lái)說(shuō),那是極好的!可以快速上手,又能真正了解服務(wù)器端的各種,所以rails搞起來(lái)。不過一個(gè)完整的開發(fā)環(huán)境搭建過程完成后,真的只能用各種坑來(lái)形容~
    2016-02-02
  • Ruby一行代碼實(shí)現(xiàn)的快速排序

    Ruby一行代碼實(shí)現(xiàn)的快速排序

    這篇文章主要介紹了Ruby一行代碼實(shí)現(xiàn)的快速排序,本文直接給出實(shí)現(xiàn)代碼,超級(jí)簡(jiǎn)潔的一個(gè)的方法,需要的朋友可以參考下
    2015-05-05
  • 在操作系統(tǒng)上安裝Ruby解釋器的教程

    在操作系統(tǒng)上安裝Ruby解釋器的教程

    這篇文章主要介紹了在操作系統(tǒng)上安裝Ruby解釋器的教程,包括Linux系統(tǒng)以及Unix和Windows系統(tǒng)下的安裝方法,需要的朋友可以參考下
    2015-10-10
  • Rails中使用MySQL分區(qū)表一個(gè)提升性能的方法

    Rails中使用MySQL分區(qū)表一個(gè)提升性能的方法

    這篇文章主要介紹了Rails中使用MySQL分區(qū)表一個(gè)提升性能的方法,本文總結(jié)出了一個(gè)簡(jiǎn)單的方法實(shí)現(xiàn)避免掃描全部的分區(qū)表,從而提升性能,需要的朋友可以參考下
    2015-03-03
  • Ruby中變量引用時(shí)的一些注意點(diǎn)

    Ruby中變量引用時(shí)的一些注意點(diǎn)

    這篇文章主要介紹了Ruby中變量引用時(shí)的一些注意點(diǎn),被當(dāng)作變量或被當(dāng)作方法調(diào)用的情況,需要的朋友可以參考下
    2015-07-07

最新評(píng)論