39

これは私にとってよくある反復的なイディオムです: 正規表現を使用して配列をフィルタリングし、サブ配列を返します。私のアプローチはあまり 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
4

6 に答える 6

74

すべての 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"]]
于 2013-06-27T23:47:32.943 に答える
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」に一致できるようにするためです。

于 2013-06-27T23:27:22.073 に答える
5

この特定の問題については、正規表現なしで行くことができます。使用する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"]
于 2013-06-28T03:57:07.950 に答える