理解Ruby中Enumerable的find函数

时间:2012-12-25 13:28:10

标签: ruby enumerable

我正在阅读Andre Ben Hanou的“实用Ruby for System Administration”,它有一个单行程序,列出了大小超过1KB的目录中的所有文件,然后按修改日期排序。

ruby -e 'puts Dir["*"].find { |f| File.size(f) > 1024 }.sort_by{|f| File.mtime(f)}'

我认为它应该是select而不是find

根据find的文档,它返回块不为false的第一个。因此,find在任何情况下都不会返回文件列表。这就像书中的第19页,我对Ruby完全不熟悉,我认为作者错了,因为书中的命令已经给我一个错误。

shadyabhi@archlinux /tmp $ ruby -e 'puts Dir["*"].find { |f| File.size(f) > 1024 }.sort_by{|f| File.mtime(f)}'
-e:1:in `<main>': undefined method `sort_by' for "mysql-security-excerpt-5.1-en.pdf":String (NoMethodError)
shadyabhi@archlinux /tmp $ 

任何人都可以确认作者是错的还是我只是愚蠢的?

2 个答案:

答案 0 :(得分:4)

您是对的,它应该是.select(或其别名.find_all,这可能是造成此错误的原因。)

在这种情况下,将为每个对象评估块,这是一个教程:     http://www.tutorialspoint.com/ruby/ruby_blocks.htm

答案 1 :(得分:2)

  

列出所有文件

是的,作者错了,你是对的。它应该是.select,而不是.find