2012-02-28 7 views
1

Можно создать дубликат:
What is the * operator doing to this string in RubyУнарное * Оператор Руби

я наткнулся на следующий код при поиске простой способ преобразовать массив в хэш (по аналогии с ToDictionary .NET в метод на IEnumerable ... Я хотел иметь возможность произвольно установить ключ и значение).

a = [ 1, 2, 3, 4, 5, 6 ] 
h = Hash[ *a.collect { |v| [ v, v ] }.flatten ] 

Мой вопрос, что же звездочка перед тем a.collect делать?

Кстати, код приходит от http://justatheory.com/computers/programming/ruby/array_to_hash_one_liner.html

+0

Ах, еще не нашлось. Звездочку сложно найти, потому что Google и SO фильтруют ее из поисковых запросов. –

+0

Ну, теперь вы знаете, что это называется «splat». :-) –

+0

Спасибо за помощь @JoshLee. –

ответ

4

Это решетчатого оператор, если вы хотите, чтобы Google это. Он преобразует массив в список (поэтому вы можете использовать массив в качестве аргументов для метода). Он также делает обратное: он может «разграбить» список в массив.

require 'date' 
*date_stuff = 2012,2,29 # slurp 
p date_stuff #=> [2012, 2, 29] 
Date.new(*date_stuff) # regurgitate 
+0

Спасибо за информацию о бонусе в противоположном поведении. –

+0

не 'a, b = * [: one,: two]' называется кортежем в общем программировании? – farnoy

+0

@fanoy - Я ничего не знаю о кортежах в общем программировании. Ваш код работает; он даже работает без splat (что странно). – steenslag

Смежные вопросы