Что делает * перед строковым литералом в ruby? - PullRequest
5 голосов
/ 27 октября 2010

Этот код, кажется, создает массив с диапазоном от a до z, но я не понимаю, что делает *. Может кто-нибудь объяснить, пожалуйста?

[*"a".."z"]

Ответы [ 3 ]

12 голосов
/ 27 октября 2010

Он называется оператором сплата .

Распространение L-значения

В этом случае может быть выделено не более одного l-значения.присваивается массив, состоящий из оставшихся значений, в которых отсутствуют соответствующие значения.Если крайнее правое значение l равно значению, оно потребляет все значения, которые еще не были соединены со значениями l.Если за разделенным lvalue следуют другие lvalue, он потребляет как можно больше rvalue, в то же время позволяя следующим lvalue получить свои значения:

*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

Пустой Splat

Значение может состоять из единственной звездочки (U + 002A) без какого-либо связанного идентификатора.Он ведет себя так, как описано выше, но вместо присвоения соответствующих r-значений разделенному l-значению он отбрасывает их.

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

Splatting-R-значение

Когда r-значение равноразделенный на части он преобразуется в массив с помощью Kernel.Array (), элементы которого сами по себе становятся значениями.

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
0 голосов
/ 26 сентября 2012

Да, забавный факт.Когда вы делаете это:

*(0..50)

, вы получаете ошибку.

Оператору сплат в этом случае требуется приемник для работы.Так что не обманывайте себя, думая, что он сломан в irb, просто попробовав его без приемника.

0 голосов
/ 27 октября 2010

Оператор splat расширяет диапазон в массив.

...