如何将Ruby方法转换为块?

时间:2013-08-15 12:28:30

标签: ruby styles pointfree

有没有办法简化以下代码?

文件名是文件名(字符串)的列表,例如[“foo.txt”,“bar.c”,“baz.yaml”]

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

有没有办法将“File.size”变成proc或block?对于现有对象的方法,我可以&:method。模块级方法有类似的东西吗?

3 个答案:

答案 0 :(得分:25)

您可以使用Object#method(method_name)

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

答案 1 :(得分:4)

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

答案 2 :(得分:4)

Stdlib的Pathname为文件和目录提供了一种更面向对象的方法。也许有一种方法可以重构你的filelist,例如而不是:

filenames = Dir.entries(".")
filenames.map { |f| File.size(f) }
你会用:

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