Символ # to_proc полезен как сокращение для базового случая вызова одного метода.Если вы хотите что-то более сложное, просто перейдите на длинную строку
['Hi', 'Yo'].map { |word| [word.upcase, word.downcase] }
, которая вернет [['HI', 'hi'], ['YO', 'yo']]
- которую вы могли бы затем назвать flatten
, если вместо этого вы хотите ['HI', 'hi', 'YO', 'yo']
.
ОБНОВЛЕНИЕ: Поскольку вы на самом деле хотите [['HI','YO'], ['hi', 'yo']]
, вы можете вызвать транспонирование для результатов
['Hi', 'Yo'].map { |w| [w.upcase, w.downcase] }.transpose
Примечание: следующее - ужасная идея, и никто не должен реализовывать ее в реальном коде, потому чтозначение Array # to_proc было бы совершенно неочевидным (вызывает ли он все и возвращает ли массив, выполняет ли он цепочку, передает ли параметры в метод и т. д.), но, поскольку вы запросили его, вы можете сделать что-то вроде
class Array
def to_proc
lambda { |o| map { |m| o.send(m) } }
end
end
, что позволило бы
['Hi', 'Yo'].map(&[:upcase, :downcase]).transpose
дать ответ, который вы запрашиваете.Он сохраняет пару символов, но не стоит той двусмысленности, которую он добавляет к коду.