对我来说,这是一个常见的,重复的习惯用法:使用正则表达式过滤数组,然后返回子数组。我的方法似乎不像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
答案 0 :(得分:61)
如果你想找到所有的GIF:
def get_all_gifs(files)
files.select{ |i| i[/\.gif$/] }
end
如果你想找到所有的jpegs:
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"]]
答案 1 :(得分:20)
看一下Enumerable.grep,它是一种非常强大的查找/过滤任何可枚举事物的方法。
答案 2 :(得分:16)
$ cat foo.rb
images = %w[foo.gif foo.png foo.jpg bar.jpeg moo.JPG]
jpgs = images.select{|e| e =~ /\.jpe?g$/i}
puts jpgs.inspect
$ ruby foo.rb
["foo.jpg", "bar.jpeg", "moo.JPG"]
对正则表达式的更改是为了除了“jpg”之外还可以匹配“jpeg”,无论大小写如何。
答案 3 :(得分:11)
images = %w[foo.gif foo.png foo.jpg bar.jpeg moo.JPG]
images.grep(/.jpg/i) # => ["foo.jpg", "moo.JPG"]
答案 4 :(得分:3)
对于这个特定问题,我们可以不使用正则表达式。使用String#end_with?
images = %w[foo.gif foo.png foo.jpg bar.jpeg moo.JPG]
images.find_all{|e| e.end_with?(".jpg",".jpeg")}
# => ["foo.jpg", "bar.jpeg"]
答案 5 :(得分:0)
ta, tb = files.partition{|f| f[/(.*\.jpe*g)/]}
ap ta
[
[0] "bar.jpg",
[1] "foo.jpeg"
]
ap tb
[
[0] "foo.gif",
[1] "bar.gif"
]
/ gucio