ルビーでは、関数型言語で見られる最初と残り(または頭と尾)をシミュレートするために、複数の代入をスプラット演算子と組み合わせることができます。
first, *rest = [1,2,3,4]
first # output: 1
rest # output: [2,3,4]
スプラットオペレーターはこれをどのように達成していますか?
ルビーでは、関数型言語で見られる最初と残り(または頭と尾)をシミュレートするために、複数の代入をスプラット演算子と組み合わせることができます。
first, *rest = [1,2,3,4]
first # output: 1
rest # output: [2,3,4]
スプラットオペレーターはこれをどのように達成していますか?
複数の割り当てで最大1つのスプラット演算子を使用できます。スプラット演算子は、右側にあるものと完全に一致するように配列の長さを調整します。言い換えると:
1)左側の変数の数が右側の配列の長さよりも大きい場合、スプラットを持つ変数には空の配列が割り当てられます。
*a = []
# => a == []
*a, b = [1]
# => a == [], b == 1
a, *b = [1]
# => a == 1, b == []
*a, b, c = [1, 2]
# => a == [], b == 1, c == 2
a, *b, c = [1, 2]
# => a == 1, b == [], c == 2
a, b, *c = [1, 2]
# => a == 1, b == 2, c == []
...
2)それ以外の場合、スプラットを持つ変数は拡張され、右側から残りの要素で埋められます。
*a = [1, 2]
# => a == [1, 2]
*a, b = [1, 2, 3]
# => a == [1, 2], b == 3
a, *b = [1, 2, 3]
# => a == 1, b == [2, 3]
*a, b, c = [1, 2, 3, 4]
# => a == [1, 2], b == 3, c == 4
a, *b, c = [1, 2, 3, 4]
# => a == 1, b == [2, 3], c == 4
a, b, *c = [1, 2, 3, 4]
# => a == 1, b == 2, c == [3, 4]
....