Enumerables zerlegen mit dem splat Operator

Es gibt Methoden, deren Definition eine variable Parameterlänge erlaubt. Array#values_at ist so ein Kandidat. Zum Beispiel, wenn Objekte mit bestimmten Indizes zurückgegeben werden sollen:

[1, 2, 3, 4, 5].values_at(0, 4) # => [1, 5]

funktioniert, solange die Indizes vorhersehbar sind. Wenn aber die Anzahl der Indizes oder die Indizes selber generiert werden, ist die einzige Möglichkeit, mit dem Array umzugehen, seine Inhalte mit dem splat Operator in eine variable Liste zu zerlegen:

indexes = [0, 4]

[1, 2, 3, 4, 5].values_at(indexes) # => TypeError: no implicit conversion of Array into Integer
[1, 2, 3, 4, 5].values_at(*indexes) # => [1, 5]

Im folgenden Beispiel wird ein Zahlen Array generiert, indem ein Range Objekt zerlegt wird.

first = 1
last = 5

numbers = (first..last) # => 1..5
numbers = *(first..last) # => [1, 2, 3, 4, 5]

Das gleiche Prinzip bei einer Mehrfachzuweisung:

languages = %w(Java Ruby)

static, dynamic = languages
static # => "Java"
dynamic # => "Ruby"

mit dem splat Operator:

languages = %w(Java Ruby Javascript)

static, *dynamic = languages
static # => "Java"
dynamic # => ["Ruby", "Javascript"]

… so mächtig.