【发布时间】:2013-08-17 15:20:21
【问题描述】:
有没有办法简化下面的代码?
filenames 是文件名(字符串)的列表,例如["foo.txt", "bar.c", "baz.yaml"]
filenames.map { |f| File.size(f) }
有没有办法把“File.size”变成一个proc或block?对于现有对象的方法,我可以做&:method。模块级方法有类似的东西吗?
【问题讨论】:
有没有办法简化下面的代码?
filenames 是文件名(字符串)的列表,例如["foo.txt", "bar.c", "baz.yaml"]
filenames.map { |f| File.size(f) }
有没有办法把“File.size”变成一个proc或block?对于现有对象的方法,我可以做&:method。模块级方法有类似的东西吗?
【问题讨论】:
filesize = proc { |f| File.size(f) }
filenames.map(&filesize)
【讨论】:
.method 返回一个lambda,而不仅仅是一个proc。试试这个,你会明白我的意思:%w{what a nice little doggo}.map(&String.new.method(:upcase))
你可以使用Object#method(method_name):
filenames.map(&File.method(:size))
【讨论】:
Stdlib 的Pathname 为文件和目录提供了一种更加面向对象的方法。也许有一种方法可以重构您的filelist,例如而不是:
filenames = Dir.entries(".")
filenames.map { |f| File.size(f) }
你会使用:
require 'pathname'
filenames = Pathname.new(".").entries
filenames.map(&:size)
【讨论】: