2010-10-27 4 views
5

Dieser Code scheint ein Array mit einem Bereich von a bis z zu erstellen, aber ich verstehe nicht, was die * tut. Kann mir bitte jemand erklären?Was macht ein * vor einem String-Literal in Ruby?

[*"a".."z"] 
+1

In diesem Fall befindet es sich nicht vor einem Zeichenfolgenliteral, sondern vor einem Bereich. –

Antwort

12

Es heißt splat operator.

Splatting einen L-Wert

Maximal einen L-Wert kann es ein Array in welchem ​​Fall splatted werden, die aus dem verbleibenden rvalues ​​zugeordnet ist, die entsprechenden L-Werte fehlen. Wenn der rechte Lvalue gesprenkelt ist, verbraucht er alle R-Werte, die noch nicht mit L-Werten gepaart wurden. Wenn auf einen gesprenkelten L-Wert andere L-Werte folgen, werden so viele R-Werte wie möglich verbraucht, während die folgenden L-Werte weiterhin ihre R-Werte erhalten können.

*a = 1 
a #=> [1] 

a, *b = 1, 2, 3, 4 
a #=> 1 
b #=> [2, 3, 4] 

a, *b, c = 1, 2, 3, 4 
a #=> 1 
b #=> [2, 3] 
C#=> 4 

Leer Splat

ein L-Wert eines Sohlen Sternchen (U + 002A) ohne zugeordnete Kennung bestehen. Es verhält sich wie oben beschrieben, aber anstatt die entsprechenden rvalues ​​dem gespritzten Lvalue zuzuweisen, werden sie verworfen.

a, *, b = *(1..5) 
a #=> 1 
b #=> 5 

rvalue Splatting

Wenn ein rvalue splatted wird es auf ein Array mit Kernel.Array() umgewandelt wird, werden die Elemente, aus denen rvalues ​​in ihrem eigenen Recht.

a, b = *1 
a #=> 1 
b #=> nil 

a, b = *[1, 2] 
a #=> 1 
b #=> 2 

a, b, c = *(1..2), 3 
a #=> 1 
b #=> 2 
C#=> 3 
+2

Neben der Zuweisung von Werten können Sie auch den splat-Operator verwenden, um Methoden zu definieren: 'def do_it (arg1, * args)'. Jetzt können Sie 'do_it (1, 2)' und 'do_it (1, 2, 3, 4)' aufrufen. – Ariejan

0

Der Splat-Operator erweitert die Palette in einem Array.

+0

In einigen Fällen * trifft dies zu. :) –

0

Huh, lustige Tatsache. Wenn Sie dies tun:

*(0..50) 

erhalten Sie einen Fehler.

Der Splat-Operator benötigt in diesem Fall einen Empfänger, um zu arbeiten. Also täusche dich nicht, wenn du es ohne einen Empfänger ausprobierst.