0

我一直在寻找这个问题的答案一段时间,但我一直无法找到一个我能够理解和应用的答案。

我有一个包含三个实例变量的类:@brand@setup@year. 我有一个包含在该类中的模块,它具有三个方法:print_brand()print_setup()print_year()简单地打印分配给关联变量的值。

我想从用户那里获取两个字符串,并使用第一个作为对象名称,第二个作为方法名称。这是我现在拥有的:

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 的 hashmap 中,然后使用b(name) 从 hashmap 中检索正确的对象。我仍然不确定您想对第二个输入做什么,我猜这个答案也涵盖了这一点。

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 回答