Ruby變數作用域的類目錄結構(補二)

2021-08-29 09:23:27 字數 1487 閱讀 9660

ruby中,類中可以定義類,類中可以定義方法,方法中可以定義方法,但是方法中不能定義類。

在前面寫的《ruby變數作用域的類目錄結構》和《ruby變數作用域的類目錄結構(補)》中聊到了前兩種情況下變數可視域的問題,關於ruby中可以在方法中定義方法這個細節,我也是今天才知道。

首先,ruby的方法中不能定義常量,所以這裡只需要考慮例項變數,普通變數,和類變數三種情況

例子一:在irb中敲入以下**:

ruby **

def meth1      

var = 1      

def meth2      

puts var  #報錯,因為var是meth1的區域性變數,在meth2中是不可見的   

endend

meth2這個方法怎麼呼叫,實際上有兩種方式,1,meth1::meth2,這種情況下,似乎方法名也變成了某種意義上的命名空間,就像是模組命和類名一樣;2:在irb提示符下直接敲入meth2,這裡遇到問題一,ruby是怎麼處理這個巢狀的def的?為什麼meth2變成了irb的乙個例項方法?

這兩種方法感覺有點兒矛盾的地方,如果meth2位於命名空間meth1下,為什麼它又是main的例項方法?反之亦然。

例子二:這次我們把meth1放到乙個類中,作為類方法

ruby **

class a      

def meth1      

var = 1      

def meth2      

puts var     

endend

def meth3   

meth1::meth2

endend

我試圖通過呼叫meth3來訪問巢狀定義的meth2方法,但是這碰到奇怪的現象,meth2通過meth1::meth2無法訪問?總是提示找不到meth2方法,但是在例子1中,基本上一樣的定義,通過meth1::meth2卻可以呼叫meth2,非常奇怪。沒有看過ruby的原始碼,那位高人了解,麻煩解釋一下。所在在這裡只能通過a.new.meth2來呼叫meth2方法。拋開問題不管,在a.new中呼叫meth2當然是錯的,因為meth2中沒有定義區域性變數var。

例子三:類似於例子二中的結構,不過這次定義了乙個例項變數@var,並且另外定義了乙個方法meth3用來列印@var

ruby **

class a         

def meth1         

@var = 1         

def meth2         

puts @var

endend

def meth3      

puts @var

endend

a = a.new

a.meth1      

a.meth2 => 1      

a.meth3 => 1    

可以看到呼叫meth2和meth3都可以正確的列印出@var的值

對於類變數的例子,結果和例子三類似。就不多說了。

Ruby變數作用域的類目錄結構(補)

ruby class a const ok class b const ko p const.object id endp const.object id end 如果你在irb中敲入上面的程式,可以發現,兩次的object id是不同的,雖然我們在b中可以看到上層目錄中定義的const,而且可以列...

Ruby 標識名和變數作用域

ruby 的標識名用來指向常量,變數,方法,類和模組。標識名的首字母用來幫助我們確定標識所指向內容的作用域。ruby 的標識名區分大小寫。ruby 使用乙個約定的來幫助它區別乙個名字的用法 a 名字前面的第乙個字元表明這個名字的用法。b 區域性變數 方法引數和方法名稱應該用乙個小寫字母開頭或者用乙個...

python和ruby變數作用域對比

python 1 a 0 2def f 3 a 9 4print a56 f 7 print a 列印出來是9和0 a 0 deff print af print a 列印出來是0和0 python呼叫f函式,執行print a的時候,會先在函式的作用域裡查詢是否有a這個變數,沒有找到再到全域性的作...