程式扎記: [ Ruby Gossip ] Basic : 方法 - 變數範圍

標籤

2014年10月27日 星期一

[ Ruby Gossip ] Basic : 方法 - 變數範圍

Source From Here 
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? 方法: 
>> x = 10
=> 10
>> X = 10
=> 10
>> defined? x
=> "local-variable"
>> defined? X
=> "constant"
>> defined? xyz
=> nil

Supplement 
Ruby 手冊 - 變數 
Ruby 手冊 - 全域變數 
Ruby 手冊 - 實例變數 
Ruby 手冊 - 區域變數 
Ruby 手冊 - 類別常數 
Ruby tutorialspoint - Ruby Variables, Constants and Literals

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!