我给了一些对象各种属性。然后我想显示具有与用户输入匹配的属性的对象:
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 :(得分:2)
假设您正确创建了Car
个实例:
matrix = Car.new(:matrix, :blue, 4)
然后,您可以使用Array#any?
方法检查数组中的任何元素是否计算为true:
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 }
答案 1 :(得分:0)
首先,您应该将参数作为String
传递给创建对象。
matrix = Car.new('matrix', 'blue', 4)
fit = Car.new('fit', 'silver', 2)
volvo = Car.new('volvo', 'silver', 4)
生成所需输出的代码与您编写的类似。
(0...cars.length).each do |x|
if response == cars[x].color
puts "We have #{cars[x].model} available"
end
end
答案 2 :(得分: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 }
请注意,您无需为每辆可用车辆指定名称。如果从大型数据库中读取可用的汽车,这是不可能的,而在上面的这个解决方案中(有一系列哈希来存储汽车的数据),这不是问题。
这导致了“全局建议”:不要考虑硬编码可能会发生变化的事情。
在这种情况下,如果您考虑过基于此代码的真实应用程序,您将如何更新汽车,不得不手动插入每辆新车,最重要的是,为它的实例找到不同的名称?
上面介绍的这种方式,如果您的汽车是从数据库中读取的,那么您只需写下以下内容:
cars = get_cars_data
其中get_cars_data是一种读取数据库的方法。唯一的要求是此方法将每辆汽车作为带有:model
,:color
和:doors
键的哈希值返回。