Ruby變數分成區域變數local Variable、全域變數global Variable、實例變數instance Variable、被類別變數class Variable四種
種類 | 變數 | 預設值 | 說明
------------- | -------------
區域變數(local Variable) | cat | 無 | 非大寫字母開頭
實例變數(instance Variable) | $cat | nil | $ 符號開頭
類別變數(class Variable) | @cat | nil | @ 符號開頭
全域變數(global Variable)| @@cat | 無 | @@ 符號開頭
進入irb來看,可以得知在還沒有初始化的全域變數以及實體變數預設值是 nil,則區域變數再沒有指定值的狀態下會跟你說找不到:
> $cat # => nil
> @cat # => nil
> cat # => Error : undefined local variable or method `cat' for main:Object
> @@cat # => Error : uninitialized class variable @@cat in Object
區域性變數以非大寫字母為開頭開頭。有效範圍從class、module、def或do end {},但如果超過指定的範圍,就會找不到了。
def method
local = "abc"
puts local # abc 區域變數,在方法內可取得值
@instance = "xyz"
end
method
puts local # 定義方法外會出現error:undefined local variable or method
實例變數以@符號開頭,在類別中,可以讓所以的方法共用得變數,且變數的值會根據各個方法而儲存不同的值,實體變數在class互相取值前記得要先將物件實體化之後才能互相使用。
類別變數@@符號開頭,類別變數與實例變數得差異就在繼承,由於類別變數除了在自己的class,因為繼承也可以直接在其他得class使用,為了避免日後專案出錯,通常是建議最好不要去使用它。
class Animal
@@cat = :a
@dog = :b
def self.cat
@@cat
end
def self.dog
@dog
end
end
class Zoo < Animal
end
p Animal.dog # :b
p Zoo.dog # nil
p Animal.cat # :a
p Zoo.cat # :a
全域變數$開頭,在尚未初始化前全域變數的預設值為nil。顧名思義全域變數能夠編寫於任何地方,在使用上相對危險。
除了以上四種變數外,還有Ruby本身自己定義的變數,稱為虛擬變數,例如 nil, self, true, false,這些虛擬變數都有特別用途或意義,所以內容是不能被更改的。
> true = 0 # => Error : Can't assign to true
> self = 0 # => Error : Can't change the value of self
使用方式跟變數差不多,但Ruby對常數有特別的命名規定就是大寫英文字母開頭,就像所有的類別、模組的名字都必須是常數大寫字母開頭。
Cat = 123
Dog = "Meeks"
MyName = "Aimee" #=> Aimee
MyName << "Lo" #=> AimeeLo
而且在Ruby程式語言裡,常數的內容是可以修改,即便有跳出警告訊息,但還是可以正常使用。
> MyName = "Amy"
=> "Amy"
> MyName = "Aimee"
warning: already initialized constant MyName
warning: previous definition of MyName was here # 出現警告
=> "Aimee"
> MyName
=> "Aimee" # 依然可以更改
參考連結:
變數、常數、流程控制、迴圈
「Ruby筆記06」實例變數・類別變數・類別實例變數的差異與用法
[Ruby] 變數(variable)與常數(Constant)