1

namegenre、およびの3 つのメソッドを持つフィルター クラスを作成したいと考えていますyear。すべてのオブジェクトが複数の基準でnametitleおよび を持っている映画のリストをフィルタリングしたいと考えています。year

これを行う方法がわかりません。例えば:

Filter.name("Batman") & Filter.genre("Drama") | !Filter.year(2001)

フィルター フィールドを list などに保持しようとしました[name => batman, genre=>drama]が、演算子 (特にor( |)) に悩まされています。

どんなアイデアでも受け付けます。

4

3 に答える 3

8

Try this:

let ary contains the list of objects

ary.select{|obj| obj.name == 'batman' && obj.genre == 'drama' || obj.year != 2001}

I have assumed that you have objects in a list, watch out for the && and || operator pririties

Or you expecting this?

class Filter
  def self.search_by(ary, name, genre, year)
    ary.select{|obj| obj.name == name && obj.genre == genre || obj.year != year}
  end
end

ary = all_films # assume function returns all films
Filter.search_by(ary, 'batman', 'drama', 2001)
于 2012-10-28T17:07:30.763 に答える
5

必要な機能は、Array が継承する Enumerable の select に自然に適合します。

リスト、AKA、配列について話しているので、select を使用して、ムービーをメソッドに渡すのではなく、それに基づいて構築することにより、ムービーが基準を満たすかどうかを判断するのが自然に適しています。

別の Filter クラスも Ruby のやり方には適合しません。映画リストの Array をサブクラス化し、条件をパラメーターとして受け取るフィルター メソッドを追加することを検討してください。

その機能を次のように記述しますが、より Ruby に似ていると思われる方法でそれを実行します。

require 'pp'

class Movies < Array

  def initialize(*movies)
    super(movies)
  end

  def filter(criteria={})
    self.select{ |m| 
      criteria.all?{ |c, v| 
        m.send(c, v) 
      }
    }
  end
end

class Movie

  def initialize(attributes={})
    @movie = attributes
  end

  def name(t)
    case t
    when Regexp
      @movie[:name][t]
    when String
      @movie[:name] == t
    end
  end

  def genre(g)
    @movie[:genre] == g
  end

  def year(y)
    @movie[:year] == y
  end

end

movies = Movies.new(
  Movie.new(name: 'Batman', genre: 'Drama', year: 2001),
  Movie.new(name: 'The Shawshank Redemption', genre: 'Drama', year: 1994),
  Movie.new(name: 'Raiders of the Lost Ark', genre: 'Action', year: 1981)
)

pp movies.filter(year: 1981)
pp movies.filter(genre: 'Drama', year: 2001)
pp movies.filter(name: /redemption/i)

Movie クラスのハッシュを使用したのは、より高速だからです。これも汚い方法ですが、うまくいきます。

コードを実行した結果は次のとおりです。

[#<Movie:0x007ff7b191ffb8
  @movie={:name=>"Raiders of the Lost Ark", :genre=>"Action", :year=>1981}>]
[#<Movie:0x007ff7b1920260
  @movie={:name=>"Batman", :genre=>"Drama", :year=>2001}>]
[#<Movie:0x007ff7b19200d0
  @movie={:name=>"The Shawshank Redemption", :genre=>"Drama", :year=>1994}>]

ムービーをフィルタリングする実際の流れは、通常の Ruby コードの書き方に当てはまります。もっとうまくやれるかもしれませんが、それがスタートです。

于 2012-10-28T19:23:13.857 に答える
1

|二項OR演算子です

||論理 OR 演算子です。2 つのオペランドのいずれかがゼロ以外の場合、条件は真になります。

したがって、後者を取る必要があります。

このような:

Filter.name("Batman") && Filter.genre("Drama") || !Filter.year(2001)

詳細については、 http://www.tutorialspoint.com/ruby/ruby_operators.htmを参照してください。

于 2012-10-28T17:10:31.870 に答える