Preface
在 變數 中談過,在 Ruby 中有五種變數,包括區域變數、全域變數、實例變數、類別變數與常數,目前已經談過的有區塊變數、全域變數與常數,在看過 def 定義方法 與 迭代器與程式區塊 後,這邊要來談談 區塊變數、全域變數與常數的範圍問題。
變數範圍
全域變數比較不需要討論,全域變數的範圍為整個程式可見,比較要討論的是區塊變數,在Ruby中,區域變數的可見範圍真的就是「區域」,變數在哪個範圍中宣告,就在哪個範圍中可見。例如:
上例於 some 方法外定義了 x 區域變數(實際上是 Object 類別本體中的區域變數,之後還會談到),some 方法中是看不到該變數的。類似地:
some 方法中宣告了 x 區域變數,inner 是看不到該變數的。要小心以下:
上例中 some 中的 x 指定,其實是建立了新的區域變數,而不是將值指定給 some 方法外的 x 變數!
在 變數 中談過,Ruby區域變數有個特性,直譯器只要看到程式碼中有「變數=值」的語句,就會為建立該變數,這會造成有以下的結果:
在上例中,雖然 if 的區塊不會執行,但直譯器看到 a = 10,就會建立 a 變數,因此之後嘗試顯示 a 的值,是有 a 變數但預設為 nil,然後 b 變數是不存在的,因此出現錯誤。
如果在方法外定義常數的話,方法內是可見的:
如果使用程式區塊,程式區塊外的區域變數,程式區塊中是看得到的:
如果怕區塊中使用的變數,剛好與區塊外的變數同名,可以特別在分號之後宣告,告知區域中這個變數必須是區域變數:
定義程式區塊時,若區塊參數湊巧與區塊外的區域變數同名,則只會看到區塊參數:
想得知變數是哪個範圍的變數,可以使用 defined? 方法:
Supplement
* Ruby 手冊 - 變數
* Ruby 手冊 - 全域變數
* Ruby 手冊 - 實例變數
* Ruby 手冊 - 區域變數
* Ruby 手冊 - 類別常數
* Ruby tutorialspoint - Ruby Variables, Constants and Literals
沒有留言:
張貼留言