2013-12-11 2 views
0

Не могли бы вы объяснить, что приведенный ниже код делает:Как работает эта «карта»?

resp = s3.list_buckets 
puts resp.buckets.map(&:name) 

Мой вопрос специфичен для map. Я не могу понять, как здесь используется map. Кроме того, что означает (&:name)?

Я ссылался на map documentation. Тем не менее, я не могу сопоставить его с картой в коде выше. В документации за Картой должен следовать {}, но за ней следует () в приведенном выше коде.

В контексте perl map будет работать с массивом/списком и будет возвращать новый массив/список. Таким образом, похоже, что здесь тоже что-то похожее, но я не могу его расшифровать.

Любые указатели на документацию были бы полезны.

+0

Также: http://symbolhound.com/?q=ruby+%26%3A –

+0

Посмотрите раздел 'с картой' этого http://www.potstuck.com/2011/08/06/ruby -символов-вместо-о-блоков /. Он объясняет все о методе символа to_proc, который вы ищете. –

+0

@mu слишком коротко, спасибо, что обратились к дублирующим устройствам. Я использовал ключевое слово «map» во время поиска и, следовательно, не нашел их. – slayedbylucifer

ответ

2

map является псевдонимом для collect

map(&:name) является ярлык для map {|x| x.name }

map ожидает блок. & звонит to_proc на объект и передает его в виде блока, а символ имеет to_proc. Обратитесь к docs за дополнительной информацией.

+0

Я могу найти более релевантную документацию после прочтения «' map' является псевдонимом для 'collect'. Благодарю. – slayedbylucifer

1

& of (&: name) означает, что это следует за объектом Proc и будет преобразовано в кодовый блок.

С & ожидает объект Proc: имя будет преобразовано в объект Proc, это делается путем вызова: name.to_proc.

После: имя преобразуется в объект Proc, & затем преобразует полученный объект Proc в кодовый блок и дает кодовый блок для отображения.

Таким образом, происходит полное преобразование двух типов, одно преобразует символ в объект Proc, а другое преобразует объект Proc в кодовый блок.

+0

Спасибо за объяснение. +1. – slayedbylucifer

+0

Спасибо за +1. Объяснение немного неоднозначно, поэтому я переписываю новый. @slayedbylucifer – uncutstone

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