红宝石:滤镜阵列由正则表达式? [英] Ruby: filter array by regex?

查看:95
本文介绍了红宝石:滤镜阵列由正则表达式?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这对我来说是一种常见的,重复的成语:过滤使用常规的前pression,并返回一个子数组的数组。我的做法似乎并不十分红宝石似的(我来自Java的)。我最终有很多方法,这看起来很像这一点。

什么是惯用的Ruby的方式来改善这一code?

 高清get_all_gifs(items_)
  输出= Array.new
  过滤器= /\\.jpg$/
  items_.each做|项目|
    接下来,如果项目=〜过滤器
    输出<<项目
  结束
  产量
结束


解决方案

如果你想找到所有的GIF:

 高清get_all_gifs(文件)
  files.select {| I |我[/ \\ GIF $ /]}
结束

如果你想找到的所有JPEG文件:

 高清get_all_jpgs(文件)
  files.select {| I |我[/ \\。JPE?G $ /]}
结束

运行它们:

 文件=%W [foo.gif bar.jpg foo.jpeg bar.gif]
get_all_gifs(文件)#=> [foo.gif,bar.gif]
get_all_jpgs(文件)#=> [bar.jpg,foo.jpeg]


别急!还有更多!

如果你想通过自己的类型组所有这些,然后提取的基础上扩展什么?

 高清get_all_images_by_type(文件)
  files.group_by {| F | File.extname(F)}
结束

这里的文件类型:

  get_all_images_by_type(文件)。键#=> [符.gif,.JPG,.JPEG]

下面是如何抓住特定类型的:

  get_all_images_by_type(文件)#=> {符.gif=>foo.gif,bar.gif],.JPG=>bar.jpg],.JPEG=>foo.jpeg ]}
get_all_images_by_type(文件)。GIF']#=> [foo.gif,bar.gif]
get_all_images_by_type(文件).values​​_at('。JPG,.JPEG)#=> [[bar.jpg],[foo.jpeg]]

This is a common, repetitive idiom for me: filtering an array using a regular expression, and returning a sub-array. My approach doesn't seem very Ruby-like (I come from Java). I end up having many methods which look a lot like this.

What is the idiomatic Ruby way to improve this code?

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

解决方案

If you want to find all gifs:

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

If you want to find all jpegs:

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

Running them:

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"]


But wait! There's more!

What if you want to group them all by their type, then extract based on the extension?:

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

Here's the types of files:

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

Here's how to grab specific types:

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"]]

这篇关于红宝石:滤镜阵列由正则表达式?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆