Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does a * in front of a string literal do in ruby?

Tags:

ruby

splat

This code seems to create an array with a range from a to z but I don't understand what the * does. Can someone please explain?

[*"a".."z"]
like image 741
MakeM Avatar asked Oct 27 '10 08:10

MakeM


1 Answers

It's called splat operator.

Splatting an Lvalue

A maximum of one lvalue may be splatted in which case it is assigned an Array consisting of the remaining rvalues that lack corresponding lvalues. If the rightmost lvalue is splatted then it consumes all rvalues which have not already been paired with lvalues. If a splatted lvalue is followed by other lvalues, it consumes as many rvalues as possible while still allowing the following lvalues to receive their rvalues.

*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

Empty Splat

An lvalue may consist of a sole asterisk (U+002A) without any associated identifier. It behaves as described above, but instead of assigning the corresponding rvalues to the splatted lvalue, it discards them.

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

Splatting an Rvalue

When an rvalue is splatted it is converted to an Array with Kernel.Array(), the elements of which become rvalues in their own right.

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
like image 113
Simone Carletti Avatar answered Sep 28 '22 05:09

Simone Carletti