【问题标题】:Ruby FileList filteringRuby 文件列表过滤
【发布时间】:2017-11-16 03:48:41
【问题描述】:

我有一个带有*.js*.tc 扩展名的FileList。如何将其拆分为两个 FileList 数组,一个仅包含 *.js 文件,另一个包含 *.tc 文件?

【问题讨论】:

    标签: ruby-on-rails ruby filelist


    【解决方案1】:

    您可以使用File.extname 获取文件名的扩展名,并使用Array#group_by 对具有相似性的数组成员进行分组:

    result = [ "aaa.js", "bbb.js", "ccc.js", 
               "xxx.tc", "yyy.tc", "zzz.tc" ].group_by { |fname| File.extname(fname) }
    
    => { ".js" => ["aaa.js", "bbb.js", "ccc.js"], 
         ".tc" => ["xxx.tc", "yyy.tc", "zzz.tc"] }
    

    现在您有一个 Hash 包含两个数组(result[".js"]result[".tc"]),其中包含根据其扩展名的文件名。

    【讨论】:

    • .group_by(&File.method(:extname)).
    • 要获得 OP 要求的内容(我怀疑它是否真的有用),values 可以应用于 group_by 的结果。
    【解决方案2】:

    Enumerable#partition 前来救援。

    ["aaa.js", "bbb.js", "ccc.js",
     "xxx.tc", "yyy.tc", "zzz.tc" ].partition do |e|
        e[/(?<=\.).*\z/] == "tc"
      end
    #⇒ [["xxx.tc", "yyy.tc", "zzz.tc"],
    #   ["aaa.js", "bbb.js", "ccc.js"]]
    

    或者,更明确地说:

    ["aaa.js", "bbb.js", "ccc.js",
     "xxx.tc", "yyy.tc", "zzz.tc" ].partition(&/\.tc\z/.method(:=~))
    

    【讨论】:

    • 因为我们在这里打高尔夫球 :) 与 cmets:.partition {|f| f =~ /js$/} 对我来说似乎更直接。和end_with?('js') 更具可读性。
    猜你喜欢
    • 2017-02-11
    • 1970-01-01
    • 2012-10-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多