如何将用户输入与对象属性匹配

时间:2016-06-22 16:46:37

标签: ruby-on-rails ruby object input properties

我给了一些对象各种属性。然后我想显示具有与用户输入匹配的属性的对象:

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

3 个答案:

答案 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)

首先让我们明确指出这些参数(matrixblue等)必须是字符串或符号。它们是变量的方式,并且由于它们之前没有定义它们,因此您的代码会出现一些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键的哈希值返回。