[Ruby] 變數(variable)與常數(Constant)
變數種類
種類 | 範例 | 預設值 | 說明 |
---|---|---|---|
區域變數 (local Variable) | name | 沒有 | 被定義在 method 裡面的變數,它們沒辦法在該 method 外被使用。 |
實例變數 (instance Variable) | @name | nil | 可以視為 class 的屬性(attribute),並會成為物件中的屬性(property)。它可以在該 class 中被存取,因此可以被 class 中的其他 method 使用。它也可以在特定的 object 中被使用,每一個物件的屬性會各別賦值,不會和其他的物件共享,它會隨著不同的物件而有不同的值。 |
類別變數(class Variable) | @@name | 沒有 | 在同一個 class 所建立的實例物件中都可以存用,但沒辦法在不同的 class 中被取用。 |
全域變數(global Variable) | $name | nil | 可以在不同的 class 中被取用。 |
各種 $ 開頭的變數 @ Gist
區域變數和實例變數(local variable & instance variable)
def create_lv
local_var = "區域變數無法在方法外被提取"
@instance_var = "實例便是可以被任何特並的實例或物件提取"
end
create_lv
#puts local_var # error:undefined local variable
puts @instance_var # get @instance_var in create_lv
類別變數(class variable)
class Person
# 在這裡定義類別變數(class variable)
@@people_count = 0
def initialize(name)
@name = name
@@people_count += 1
end
def self.number_of_instances
@@people_count
end
end
matz = Person.new("Yukihiro")
dhh = Person.new("David")
puts "Number of Person instances: #{Person.number_of_instances}"
全域變數(global variable)
定義的方式可以透過在所有的方法和類別外定義,或者如果想要在方法或類別內部定義全域變數時,使用 $
。
在 MyClass 中定義的 local variable 並沒有辦法在 class 外被提取,但我們可以在 local variable 前面加上 $
讓它變成全域變數。
class MyClass
$my_variable = "Hello!"
end
puts $my_variable
常數(Constant)
常數需要全部都是英語大寫,中間以底線分隔,例如,THIS_IS_CONSTANCT
。
事實上,所有的類別、模組的名字都必需是常數。
要特別注意的是,Ruby 中常數的內容是可以修改而且不會發生錯誤(只會有警告,程式可以繼續運作)。
其他慣例
- 方法以
!
結尾,通常表示會改變該變數本身的值。 - 方法以
?
結尾,通常表示會回傳 Boolean。 - 方法以
=
結尾,通常表示這個方法是用來對此變數賦值(setter)。
虛擬變數(pseudo variable)
除了上述變數外,Ruby 還有一種稱之虛擬變數的東西,這是由 Ruby 自己定義的,例如 nil
, self
, true
, false
,虛擬變數通常有特別的用途或意義,所以內容不能被改變。
變數多重指定
一次賦予多個變數多個值
x = 1
y = 2
z = 3
# 可寫成
x, y, z = 1, 2, 3
# 也可寫成
x, y, z = [1, 2, 3]
當變數數目和賦值的數目不一樣多時
右邊比較多的情況(值比變數多):
a, b = 1, 2, 3, 4
# => a = 1, b = 2, 其它的內容被丟掉了
a, *b = 1, 2, 3, 4
# => a = 1, 變數 b 前面的星號會讓 b 接收剩下的數值變成一個陣列 [2, 3, 4]
x, y, z = [1, 2, 3, 4, 5]
# => x = 1, y = 2, z = 3, 剩下的被忽略
x, y, *z = [1, 2, 3, 4, 5]
# => x = 1, y = 2, 同上,z 會接受其它的值變成陣列 [3, 4, 5]
左邊比較多的情況(變數比值多)
a, b, c = 1, 2
# => a = 1, b = 2, c 因為分不到值而變成 nil
x, y, z = [1, 2]
# => x = 1, y = 2, z 因為分不到值而變成 nil
變數交換
x, y = y, x