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

2021-08-29 09:15:36 字數 1018 閱讀 2763

ruby **

class a   

const = "ok"

class b   

const = "ko"

p const.object_id   

endp const.object_id   

end

如果你在irb中敲入上面的程式,可以發現,兩次的object_id是不同的,雖然我們在b中可以看到上層目錄中定義的const,而且可以列印出它的值,但是想要給c賦值就是另外一回事了,ruby並不會認為這是在給上層目錄中的c賦值,而是認為這是在目錄a::b中新建了乙個常量c,因為常量是不允許多次賦值的,這樣自然不難理解為什麼兩者的object_id不一樣了。

讓我們多做一點兒嘗試:

ruby **

class a   

const = "ok"

def meth   

const = "ko"

endend

當我們在方法中試圖改變乙個常量的值得時候,程式會報錯,這是顯然的結果,但是從這裡可以看出來,雖然在變數的可視區域上方法和類沒有什麼區別,但是在對變數的操作時,兩者的區別還是很明顯的。

讓我們再來點兒其他好玩兒的嘗試:

ruby **

class a   

const = "ok"

class b   

p a::const   

const = "ko"

p const.object_id   

endp const.object_id   

endclass a   

const = "ok"

class b   

const = "ko"

endp a::b::const.object_id   

p a::const.object_id   

end

可以看到,我們可以通過命名空間(或者叫目錄結構)來訪問任意目錄下定義的常量,當不指定目錄結構的時候,首先從當前目錄開始尋找,然後依次向上。

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

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

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