PJCHENder 未整理筆記

[Ruby] 變數(variable)與常數(Constant)

2017-09-26

[Ruby] 變數(variable)與常數(Constant)

@(Ruby on Rails)[Ruby]

變數種類

種類 範例 預設值 說明
區域變數 (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)

1
2
3
4
5
6
7
8
9

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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 前面加上 $ 讓它變成全域變數。

1
2
3
4
5
class MyClass
$my_variable = "Hello!"
end

puts $my_variable

常數(Constant)

常數需要全部都是英語大寫,中間以底線分隔,例如,THIS_IS_CONSTANCT

事實上,所有的類別、模組的名字都必需是常數。

要特別注意的是,Ruby 中常數的內容是可以修改而且不會發生錯誤(只會有警告,程式可以繼續運作)。

其他慣例

  • 方法以 ! 結尾,通常表示會改變該變數本身的值。
  • 方法以 ? 結尾,通常表示會回傳 Boolean。
  • 方法以 = 結尾,通常表示這個方法是用來對此變數賦值(setter)。

虛擬變數(pseudo variable)

除了上述變數外,Ruby 還有一種稱之虛擬變數的東西,這是由 Ruby 自己定義的,例如 nil, self, true, false,虛擬變數通常有特別的用途或意義,所以內容不能被改變。

變數多重指定

一次賦予多個變數多個值

1
2
3
4
5
6
7
8
9
x = 1
y = 2
z = 3

# 可寫成
x, y, z = 1, 2, 3

# 也可寫成
x, y, z = [1, 2, 3]

當變數數目和賦值的數目不一樣多時

右邊比較多的情況(值比變數多):

1
2
3
4
5
6
7
8
9
10
11
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]

左邊比較多的情況(變數比值多)

1
2
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

變數交換

1
x, y = y, x

參考資料

掃描二維條碼,分享此文章