0

この質問に対する答えをしばらく探していましたが、理解して適用できる答えを見つけることができませんでした。

@brand@setup、およびの 3 つのインスタンス変数を含むクラスがあり@yearます。そのクラスに含まれるモジュールがあります。このモジュールには、、、、および関連する変数に割り当てられた値を出力するだけの3 つのメソッドがprint_brand()あります。print_setup()print_year()

ユーザーから 2 つの文字列を取得し、最初の文字列をオブジェクト名として使用し、2 番目の文字列をメソッド名として使用したいと考えています。これが私が今持っているものです:

class Bike
  include(Printers)
  def initialize(name, options = {})
    @name = name
    @brand = options[:brand]
    @setup = options[:setup]
    @year = options[:year]
  end
end

trance = Bike.new("trance x3", {
    :brand => "giant",
    :setup => "full sus",
    :year => 2011
    }
  )
giro = Bike.new("giro", {
    :brand => "bianchi",
    :setup => "road",
    :year => 2006
    }
)
b2 = Bike.new("b2", {
    :brand => "felt",
    :setup => "tri",
    :year => 2009
    }
)

puts "Which bike do you want information on?"
b = gets()
b.chomp!

puts "What information are you looking for?"
i = gets()
i.chomp!

b.send(i)

b文字列からオブジェクト名に変換する機能がいくつかありません。たとえば、ユーザーが「trance」と入力してから「print_year」と入力し、「2011」を画面に表示できるようにしたいと考えています。constantizeonを使用しようとしましbたが、うまくいかないようです。エラーが発生します:

in 'const_defined?': wrong constant name trance (NameError)

他のアイデアはありますか?

4

2 に答える 2

1

key = name および value = object を使用してオブジェクトをハッシュマップに格納し、b(name) を使用してハッシュマップから適切なオブジェクトを取得する必要があります。2番目の入力で何をしたいのかまだわかりません。私の推測では、この答えもそれをカバーしていると思います。

h = Hash.new()
h["trance x3"] = trance 
h["giro"] = giro 
...
puts "Which bike do you want information on?"
b = gets()
b.chomp!
user_bike = h[b]

puts "What information are you looking for?"
i = gets()
i.chomp!

user_bike.send(i)
于 2013-06-23T22:45:40.053 に答える
1

私は評価を使用します:

eval "#{ b }.#{ i }"

アクセサーを追加する必要があると思います:

attr_accessor :brand, :setup, :year
于 2013-06-23T22:45:43.930 に答える