【问题标题】:How to iterate over an array of hashes which contain instantiated object information in Ruby?如何遍历包含 Ruby 中实例化对象信息的哈希数组?
【发布时间】:2016-10-04 16:23:00
【问题描述】:

我创建了一个名为 Dish 的类,然后我在其中创建了许多菜单对象,包含名称和价格的菜单项,这些信息是通过初始化方法获得的。打电话时

chickenstew = Dish.new("Chicken Stew", 4.50)

然后,我使用方法def add_to_menu@menu << args 将一些这样的对象添加到一个包含在一个名为Menu 的新类的实例变量@menu = [] 的数组中。当我显示包含单个对象的新菜单数组时,您显然会得到对象信息,以及名称和价格信息,如下所示:

[[#<Dish:0x007f9662134818 @dish={:name=>"Chicken Stew", :price=>4.5}>,
  #<Dish:0x007f966206ec30 @dish={:name=>"Beef & Ale Pie", :price=>5.0}>,
  #<Dish:0x007f966101a7a8 @dish={:name=>"Chicken & Leek Pie", :price=>4.0}>,
  #<Dish:0x007f9662365420 @dish={:name=>"Vegetable Pie", :price=>3.5}>,
  #<Dish:0x007f96622de038 @dish={:name=>"Fish Pie", :price=>5.5}>,
  #<Dish:0x007f966224f068 @dish={:name=>"Chips", :price=>2.0}>,
  #<Dish:0x007f966222c1d0 @dish={:name=>"Mushy Peas", :price=>1.5}>]] 

我的问题是,您究竟如何遍历这个哈希数组,以便仅提取名称和价格详细信息,以便将puts 显示到屏幕上?我已经尝试过@menu.each { |hash| puts "Item: #{hash[:name]. Price: £#{hash[:price]}" },但这显然失败了,并且我得到了诸如 'TypeError: no implicit conversion of Symbol into Integer'

之类的错误。

任何帮助将不胜感激。

【问题讨论】:

  • 你有[[..]],所以@menu[0].each {.. 可以工作。你以为是Hash,其实是Dish对象,也就是AR对象。
  • 为那个帮助干杯,不幸的是没有,但这可能是因为我需要调用 disc.name 和 disc.price 而不是按原样尝试代码,而只是添加 [0]给它。不过干杯!
  • 没有。错误来自@menu.each { |hash| ,您认为这里的hash 是内部Array。然后你打电话给[:name],这会引发错误。所以@menu[0].each { |hash| puts "Item: #{hash[:name]. Price: £#{hash[:price]}" } 也可以。

标签: arrays ruby iteration hash-of-hashes


【解决方案1】:

这不是您数组中的哈希。这是 Dish 类的对象,所以:

@menu.first.each { |dish| puts "Item: #{dish.name}. Price: £#{dish.price}" }

【讨论】:

  • 太棒了,效果很好,感谢您的快速回复,您为我节省了数小时的反复试验。
猜你喜欢
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 2015-06-16
  • 1970-01-01
  • 2014-11-21
  • 2021-01-28
  • 2013-11-25
相关资源
最近更新 更多