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這個變數,沒有找到再到全域性的作...