代入
代入にはイコール記号 (=
) を使います。
# ローカル変数への代入
local = 1
# インスタンス変数への代入
@instance = 2
# クラス変数への代入
@@class = 3
上記のそれぞれの変数の種類については改めて説明します。
=
を使った代入のためのシンタックスシュガーがいくつか用意されています。
local += 1 # local = local + 1 と同じ
# 上記は以下の演算子でも有効
# +, -, *, /, %, |, &, ^, **, <<, >>
local ||= 1 # local || (local = 1) と同じ
local &&= 1 # local && (local = 1) と同じ
メソッド名が =
で終わるメソッドの実行にもシンタックスシュガーがあります。
# セッターメソッドの呼び出し
person.name=("John")
# 上記は次ように書ける
person.name = "John"
# インデックスに対する代入
objects.[]=(2, 3)
# 上記は次のように書ける
objects[2] = 3
# 代入とは関係ないけれど、こういうシンタックスシュガーも
objects.[](2, 3)
# 上記は次のように書ける
objects[2, 3]
=
のシンタックスシュガーはセッターやインデックス代入に対しても有効です。このとき ||
と &&
は、 []?
メソッドをキーの存在のチェックに使うことに注意してください。
person.age += 1 # person.age = person.age + 1 と同じ
person.name ||= "John" # person.name || (person.name = "John") と同じ
person.name &&= "John" # person.name && (person.name = "John") と同じ
objects[1] += 2 # objects[1] = objects[1] + 2 と同じ
objects[1] ||= 2 # objects[1]? || (objects[1] = 2) と同じ
objects[1] &&= 2 # objects[1]? && (objects[1] = 2) と同じ
連続した代入
連続した代入を用いることで、同じ値を複数の変数に一度に代入することができます。
a = b = c = 123
# このとき a, b, c は同じ値になる
a # => 123
b # => 123
c # => 123
連続した代入はローカル変数に限らずインスタンス変数やクラス変数、セッターメソッド (名前が =
で終わるメソッド) に対して利用できます。
多重代入
複数の式をカンマ記号 (,
) で区切って代入すると、複数の変数に対して同時に宣言/代入を行うことができます。
name, age = "Crystal", 1
# 上記は以下と同じ
temp1 = "Crystal"
temp2 = 1
name = temp1
age = temp2
また、式は一時的な変数に代入される仕組みになっているため、次のように1行で変数の値を交換することも可能です。
a = 1
b = 2
a, b = b, a
a # => 2
b # => 1
代入式の右辺に1つしか式が無かった場合、次の例のように各変数に順にインデックスして代入していきます。
name, age, source = "Crystal, 123, GitHub".split(", ")
# 上記は以下に同じ
temp = "Crystal, 123, GitHub".split(", ")
name = temp[0]
age = temp[1]
source = temp[2]
多重代入は名前が=
で終わるメソッドに対しても有効です。
person.name, person.age = "John", 32
# 以下に同じ
temp1 = "John"
temp2 = 32
person.name = temp1
person.age = temp2
そして、インデックス指定の代入 ([]=
) の場合にも同様に有効です。
objects[1], objects[2] = 3, 4
#以下に同じ
temp1 = 3
temp2 = 4
objects[1] = temp1
objects[2] = temp2