2016-06-22 22 views
0

いくつかのオブジェクトにさまざまなプロパティを与えました。そして私は、ユーザーの入力に一致するプロパティを持つオブジェクトを表示したい:すべてのユーザーの入力とオブジェクトのプロパティを一致させる方法

Car = Struct.new(:model, :color, :number_doors) 

matrix = Car.new(matrix, blue, 4) 
fit = Car.new(fit, silver, 2) 
volvo = Car.new(volvo, silver, 4) 

cars = [matrix, fit, volvo] 

puts "What color car do you want?" 
response = gets.chomp 

# something like 
# if response == cars[X].color 
# puts "We have #{cars[X].model} available 
+0

まず、 'matrix'、' blue'、 'fit'、' silver'、 'volvo'などの文字列に注意する必要があります。これらのパラメータはすべて文字列( 'matrix')またはシンボル(: 。たとえば、行列の定義は今のところ、循環的な依存関係に依存しています。 –

+1

ようこそスタックオーバーフロー。私は、リンクされたページ、特に長くても非常に有用なhttp://catb.org/esr/faqs/smart-questions.htmlを含めて、 "[ask]"を読むことをお勧めします。あなたが新しいのであれば私たちは気にしません、よく尋ねられる質問が必要です。 –

答えて

0

まず、あなたは、オブジェクトを作成するためにStringようにパラメータを渡す必要があります。

  • matrix = Car.new('matrix', 'blue', 4)
  • fit = Car.new('fit', 'silver', 2)
  • volvo = Car.new('volvo', 'silver', 4)

所望の出力を生成するコードは、あなたが書いたものと同様です。配列の任意の要素がtrueと評価された場合は、その後、Array#any?メソッドを使用することができます

matrix = Car.new(:matrix, :blue, 4) 

を確認するには:

 (0...cars.length).each do |x| 
     if response == cars[x].color 
      puts "We have #{cars[x].model} available" 
     end 
     end 
+0

この場合、完全な応答を得るには、モデルに「Car」を作成する方法をOPに示す必要があります。あなたがOPを示したときにコードを実行すると、以前定義されていない限り、Rubyは 'Car'という名前のオブジェクトを認識しないため、'

: '' car:rb:8:uninitialized constant Car(NameError) ''それはどこかにある。 –

2

あなたが正しくCarインスタンスを作成すると仮定すると、

cars.any? { |car| car.color.to_s == response } 
# returns true or false 

をだからあなたコードは次のようになります。

puts "We have #{cars[x].model} available" if cars.any? { |car| car.color.to_s == response } 
+0

この場合、完全な応答を得るためには、モデルカーの作成方法をOPに示す必要があります。 OPを表示したときにコードを実行すると、以前はどこかで定義していない限り、Car'という名前のオブジェクトは認識されないため、cars.rb:8:in

':初期化されていない定数Car(NameError) OPは彼がノブだと言いましたが、Carインスタンスの作成方法を知っているとは思わない方がいいでしょうか? –

0

まず、これらのパラメータ(matrix,blueなど)が文字列または記号であることを確認します。それは変数なのですが、これまで定義されていなかったように、あなたのコードにはエラーUndefined variable XXXが発生します。ほかに

、あなたが何か書くとき:

matrix = Car.new(matrix, blue, 4) 

を外部に定義されているmatrixは内部matrixの前の定義に依存するため、あなたは、環状の定義を持っています。

あなたのコードのようなものでなければなりません:あなたが使用可能な各車に名前を割り当てる必要はありません

cars = [ { model: 'matrix', color: 'blue', doors: 4}, {model: 'fit', color: 'silver', doors: 2}, { model: 'volvo', color: 'silver', doors: 4} ] 

puts "What color car do you want?" 
response = gets.chomp 

cars.each{ |car| puts "We have #{car[:model]} available" if car[:color] == response } 

注意してください。これは、利用可能な車が大きなデータベースから読み取られた場合には不可能であるが、上記の解決策(車のデータを格納するためのハッシュの配列)では、これは問題ではない。

これは、「大きな画像のアドバイス」につながります。変更される可能性のあるものをハードコードすることについて考えないでください。

このコードに基づいて実際のアプリケーションについて考えたことがあれば、新しい車を手動で挿入する必要があります。また、最悪の場合はインスタンスの名前を変更する必要がありますそれ?

あなたの車は、あなただけのような何か書きますデータベースから読み込まれている場合、私は、上記のこの方法:get_cars_dataはデータベースを読み込むための方法である

cars = get_cars_data 

を。唯一の要件は、このメソッドは各車を:model,:colorおよび:doorsのキーでハッシュとして返すことです。

関連する問題