如何使用字符串调用对象的方法?

时间:2013-06-23 22:40:07

标签: ruby

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

我有一个包含三个实例变量的类:@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”。我尝试在constantize上使用b,但这似乎不起作用。我收到错误:

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

还有其他想法吗?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

我会使用eval:

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

我想你必须添加访问者:

attr_accessor :brand, :setup, :year