【问题标题】:Understanding find function on an Enumerable in Ruby了解 Ruby 中 Enumerable 上的 find 函数
【发布时间】:2012-12-11 10:46:08
【问题描述】:

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

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

我认为应该是select 而不是find

根据find 的文档,它返回块不为假的第一个。因此,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 $ 

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

【问题讨论】:

  • 关于 SO 有很多答案,解释了如何将块传递给函数。因为 SO 想要一个问题,而不是几个问题,所以您应该删除那个单独的问题,进行一些搜索以获取更多信息并查看块是否有意义。阅读“[Programming Ruby](方法和块)”的“方法和块”部分,其中谈到了它。

标签: ruby enumerable


【解决方案1】:

你是对的,它应该是.select(或者它的别名.find_all,这可能是这个错误的原因)。

在这种情况下,块会针对每个对象进行评估,这里有一个教程: http://www.tutorialspoint.com/ruby/ruby_blocks.htm

【讨论】:

  • 感谢您告知find_all
【解决方案2】:

列出所有文件

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

【讨论】:

    猜你喜欢
    • 2016-03-21
    • 2021-05-21
    • 2011-06-16
    • 2017-07-07
    • 2013-11-19
    • 2011-03-03
    • 2014-08-14
    • 2013-04-01
    • 2013-03-18
    相关资源
    最近更新 更多