Что делает (унарный) оператор * в этом коде Ruby? - PullRequest
165 голосов
/ 28 мая 2009

Учитывая код Ruby

line = "first_name=mickey;last_name=mouse;country=usa" 
record = Hash[*line.split(/=|;/)] 

Я все понимаю во второй строке, кроме оператора * - что он делает и где документация для этого? (как вы можете догадаться, поиск этого дела оказывается трудным ...)

Ответы [ 3 ]

255 голосов
/ 28 мая 2009

* - это оператор splat .

Расширяет Array в список аргументов, в данном случае список аргументов для метода Hash.[]. (Точнее, он расширяет любой объект, который отвечает на to_ary / to_a или to_a в Ruby 1.9.)

Для иллюстрации, следующие два утверждения равны:

method arg1, arg2, arg3
method *[arg1, arg2, arg3]

Он также может использоваться в другом контексте, чтобы перехватить все оставшиеся аргументы метода в определении метода. В этом случае он не расширяется, а объединяется:

def method2(*args)  # args will hold Array of all arguments
end

Более подробная информация здесь .

40 голосов
/ 28 мая 2009

Оператор splat распаковывает массив, переданный функции, так что каждый элемент отправляется в функцию как отдельный параметр.

Простой пример:

>> def func(a, b, c)
>>   puts a, b, c
>> end
=> nil

>> func(1, 2, 3)  #we can call func with three parameters
1
2
3
=> nil

>> list = [1, 2, 3]
=> [1, 2, 3]

>> func(list) #We CAN'T call func with an array, even though it has three objects
ArgumentError: wrong number of arguments (1 for 3)
    from (irb):12:in 'func'
    from (irb):12

>> func(*list) #But we CAN call func with an unpacked array.
1
2
3
=> nil

Вот и все!

7 голосов
/ 28 мая 2009

Как все упоминают, это "сплат". Искать синтаксис Ruby невозможно, и я задавал это в других вопросах. Ответ на эту часть вопроса заключается в том, что вы ищете на

asterisk in ruby syntax

в гугле. Google для вас, просто поместите то, что вы видите, в слова.

В любом случае, как много кода на Ruby, этот код довольно плотный.

line.split(/=|;/)

создает массив элементов SIX, first_name, mickey, last_name, mouse, country, usa. Затем сплат используется для преобразования в хэш. Теперь люди из Ruby всегда посылают вас посмотреть на метод Splat, поскольку в Ruby все открыто. Я понятия не имею, где он находится, но как только вы это сделаете, вы увидите, что он запускает for через массив и создает хэш.

Вы искали бы код в документации core . Если вы не можете его найти (я не смог), вы попытаетесь написать такой код (который работает, но НЕ похож на Ruby):

line = "first_name=mickey;last_name=mouse;country=usa"
presplat = line.split(/=|;/)
splat = Hash.new
for i in (0..presplat.length-1)
    splat[presplat[i]] = presplat[i+1] if i%2==0
end

puts splat["first_name"]

и тогда банда Ruby сможет сказать вам, почему ваш код глуп, плох или просто неверен.

Если вы читали это далеко, прочитайте документацию Hash для инициализации.

Обычно хеш, который инициализируется несколькими аргументами, создает их как пары ключ-значение:

Hash["a", 100, "b", 200] #=> {"a"=>100, "b"=>200}

Итак, в вашем примере это приведет к следующему хешу:

{"first_name"=>"mickey", "last_name"=>"mouse", "county"=>"usa"}
...