letters = ["a", "b", "c", "d", "e"]
first, *second = letters
first # => "a"
second # => "["b", "c", "d", "e"]
これが何を生み出すかは理解していますが、これについて頭を悩ませることはできません。これは基本的にRubyマジックですか?splat 演算子を使用したこのタイプの代入をサポートするプログラミング言語は他に考えられません。
letters = ["a", "b", "c", "d", "e"]
first, *second = letters
first # => "a"
second # => "["b", "c", "d", "e"]
これが何を生み出すかは理解していますが、これについて頭を悩ませることはできません。これは基本的にRubyマジックですか?splat 演算子を使用したこのタイプの代入をサポートするプログラミング言語は他に考えられません。
これは関数型言語ではよくあることなので、Ruby だけではありません。アイテムのリストがあり、それを と で分けて、head
リストtail
の最初の要素に対して操作を実行できるようにします。
これも機能します:
letters = ["a", "b", "c", "d", "e"]
first, *middle, last = letters
Clojure のような関数型言語では、次のようになります。
(first '(1 2 3)) => 1
(rest '(1 2 3)) => (2 3)
これは非常に興味深いことであり、すべての「魔法の特性」が非常に詳細に説明されています。
例えば
a, *b, c = [1, 2, 3, 4, 5]
a # => 1
b # => [2, 3, 4]
c # => 5
a, (b, c) = [2,[2,[6,7]]]
a
=> 2
b
=> 2
c
=> [6, 7]
基本的に配列を作成すると思います。次の例を見てください。
> *foo = 1
> foo
=> [1]
したがって、ここで*second
は配列を作成し、からすべての要素を抽出しますletters[1..-1]
。letters[1]
それ以外の場合は"b"
、second
変数に を割り当てるだけです。
誰かがより良い説明を思い付くと確信していますが、基本的な考え方はここにあります。
スプラット オペレーターの詳細については、 を参照してください。