对我来说,这是一个常见且重复的习惯用法:使用正则表达式过滤数组,然后返回子array.我的方法看起来不太像Ruby(我来自Java).我最终得到了很多看起来很像这样的方法.

改进这段代码的惯用Ruby方法是什么?

def get_all_gifs(items_)
  output = Array.new
  filter = /\.jpg$/
  items_.each do |item|
    next if item =~ filter
    output << item
  end
  output
end

推荐答案

如果你想找到所有的GIF:

def get_all_gifs(files)
  files.select{ |i| i[/\.gif$/] }
end

如果要查找所有JPEG:

def get_all_jpgs(files)
  files.select{ |i| i[/\.jpe?g$/] }
end

运行它们:

files = %w[foo.gif bar.jpg foo.jpeg bar.gif]
get_all_gifs(files) # => ["foo.gif", "bar.gif"]
get_all_jpgs(files) # => ["bar.jpg", "foo.jpeg"]

但是等等!还有更多!

如果您想按类型对它们进行分组,然后根据扩展名进行提取,该怎么办

def get_all_images_by_type(files)
  files.group_by{ |f| File.extname(f) }
end

以下是文件的类型:

get_all_images_by_type(files).keys # => [".gif", ".jpg", ".jpeg"]

以下是如何获取特定类型:

get_all_images_by_type(files) # => {".gif"=>["foo.gif", "bar.gif"], ".jpg"=>["bar.jpg"], ".jpeg"=>["foo.jpeg"]}
get_all_images_by_type(files)['.gif'] # => ["foo.gif", "bar.gif"]
get_all_images_by_type(files).values_at('.jpg', '.jpeg') # => [["bar.jpg"], ["foo.jpeg"]]

Ruby相关问答推荐

使用map DO使用嵌套数组重构对象数组

为什么 rdoc 注释似乎以两个井号/井号符号开头?

安全导航运算符的使用是否应该在两种情况下进行单元测试(对象存在 + 对象无)?

如何在 Ruby 中为链表实现#pop

Ruby:如何在 vanilla ruby​​ 中使用有效支持日期?

如何在 rspec 中使用 `eq` 匹配器和 `hash_include` 匹配器来获取哈希数组

厨师从源代码安装和更新程序

以编程方式获得完整的 Ruby 版本?

如何正确截断表格?

在文件中搜索字符串的最佳方法是什么?

如何让 Ruby 解析时间,就好像它在不同的时区一样?

卸载所有 gem Ruby 2.0.0

我可以在 Ruby 2.x 中要求命名参数吗?

Ruby 中的方法: objects与not?

有没有办法在 RSpec 中取消存根?

我不明白Ruby本地范围(local scope)

在 ruby​​ 的超类中调用另一个方法

无法在 Windows 上安装 Aptana Studio 3.6

Ruby中的file.open、open和IO.foreach,有什么区别?

如何在不使用循环的情况下按数组中的计数分组