ruby: что означает звездочка в p *1..10

линия

p *1..10

делает то же самое, что и

(1..10).each { |x| puts x }

который дает вам следующий вывод:

$ ruby -e "p *1..10"
1
2
3
4
5
6
7
8
9
10

например, это отличный ярлык при работе с textmate, но что делает звездочка? как это работает? в сети ничего не нашел...


person Patrick Oscity    schedule 13.11.2009    source источник


Ответы (1)


Это оператор splat. Вы часто будете видеть, как он используется для разделения массива на параметры функции.

def my_function(param1, param2, param3)
  param1 + param2 + param3
end

my_values = [2, 3, 5]

my_function(*my_values) # returns 10

Чаще всего он используется для принятия произвольного количества аргументов.

def my_other_function(to_add, *other_args)
  other_args.map { |arg| arg + to_add }
end

my_other_function(1, 6, 7, 8) # returns [7, 8, 9]

Это также работает для множественного присваивания (хотя оба этих утверждения будут работать без знака):

first, second, third = *my_values
*my_new_array = 7, 11, 13

Для вашего примера эти два будут эквивалентны:

p *1..10
p 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
person Neall    schedule 13.11.2009
comment
Мне кажется, что a, b, c = *myvalues ​​эквивалентны a, b, c = myvalues ​​или в этом случае ruby ​​неявно использует оператор splat? - person Patrick Oscity; 13.11.2009
comment
@Patrick Да, присваивание, в котором есть один объект с одной стороны и несколько объектов с другой, будет как бы подразумевать оператор знака. Так что это не очень полезный пример, я думаю. - person Neall; 13.11.2009