Как использовать Proc в качестве блока - PullRequest
0 голосов
/ 27 декабря 2018

Учитывая массив myarr и метод foo, который понимается каждым элементом массива, я могу создать новый массив следующим образом:

mapper = :foo
newarr = myarr.map(&mapper)

, поскольку ярлык & поворачиваетсимвол, сохраненный в mapper в Proc.

Предположим, mapper не является Symbol, но уже является экземпляром Proc.Затем:

mapper = :foo.to_proc
newarr = myarr.map(mapper)

вызывает ошибку, поскольку Array#map не принимает параметр.

Конечно, я могу сделать:

newarr = myarr.map {|x| mapper.call(x)}

, но мне интересноесть ли у вас ярлык быстрого доступа (похожий на &:foo), который я могу использовать здесь.

1 Ответ

0 голосов
/ 27 декабря 2018

Просто выполните:

newarr = myarr.map(&mapper)

Экземпляр Proc является объектом, тогда как блок не является объектом.Они не взаимозаменяемы.Вам нужно преобразовать одно в другое, используя &.В случае, если mapper является символом, эффект & в &mapper заключается не только в преобразовании mapper в Proc экземпляр;это всего лишь часть процесса преобразования / интерпретации mapper в / как блок.Это не отличается, когда mapper уже является экземпляром Proc;только этот промежуточный этап преобразования его в экземпляр Proc становится тривиальным.

...