Как превратить Ruby-метод в блок?

Есть ли способ упростить следующий код?

filenames - список имен файлов (строк), например. [ "foo.txt", "bar.c", "baz.yaml" ]

filenames.map { |f| File.size(f) }

Есть ли способ превратить "File.size" в proc или block? Для методов на существующих объектах я могу сделать &:method. Есть ли что-то аналогичное для методов уровня модуля?

Ответы

Ответ 1

Вы можете использовать Object # method (имя_файла) (хотя AFAIK не является идиоматическим):

filenames.map(&File.method(:size))

Ответ 2

filesize = proc { |f| File.size(f) }
filenames.map(&filesize)

Ответ 3

Stdlib Pathname обеспечивает более объектно-ориентированный подход к файлам и каталогам. Возможно, есть способ реорганизовать ваш filelist, например. вместо:

filenames = Dir.entries(".")
filenames.map { |f| File.size(f) }

вы бы использовали:

require 'pathname'
filenames = Pathname.new(".").entries
filenames.map(&:size)