我一直在寻找这个问题的答案,但我找不到一个我能够理解和应用的答案。
我有一个包含三个实例变量的类:@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)
还有其他想法吗?
答案 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