Ruby类型错误:没有将符号隐式转换为整数

时间:2018-08-12 22:35:04

标签: arrays ruby hash nested typeerror

rideshare_data = {
  DR0001: [
    {
      DATE: "02_03_2016",
      COST: 10,
      RIDER_ID: "RD0003",
      RATING: 3
    },
    {
      DATE: "02_03_2016",
      COST: 30,
      RIDER_ID: "RD0015",
      RATING: 4
    },
    {
      DATE: "02_05_2016",
      COST: 45,
      RIDER_ID: "RD0003",
      RATING: 2
    }
  ],
  DR0002: [
    {
      DATE: "02_03_2016",
      COST: 25,
      RIDER_ID: "RD0073",
      RATING: 5
    },
    {
      DATE: "02_04_2016",
      COST: 15,
      RIDER_ID: "RD0013",
      RATING: 1
    },
    {
      DATE: "02_5_2016",
      COST: 35,
      RIDER_ID: "RD0066",
      RATING: 3
    }
  ]
}

rideshare_data.each do |driver_id, driver_data|
  money_earned = 0
  driver_data.each do |rides|
    rides.each do |ride, ride_data|
      money_earned = [ride_data][:COST].reduce(:+)
      puts "#{driver_id} earned #{money_earned} total"
    end
  end
end

所以我有一个数组和哈希的数据集,我试图通过对:COST键求和来找到每个驱动程序所赚取的总收入。无论我在最后一个块中尝试什么,都会得到错误,即没有将Symbol / Hash / String隐式转换为Integer。帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

由于在数组上使用[],因此Ruby希望您传递一个整数,因为只能通过其索引访问数组,这就是为什么它会返回此类错误。

no implicit conversion of Symbol into Integer (TypeError)

[ride_data]的结果为您提供了数组中的字符串,因此,您将无法传递符号,无法像访问Hash对象那样访问键。

由于rideshare_data是一个哈希,每个键包含不同的值(驱动程序ID),因此您可以迭代每个键的值并获取每个COST键的值,然后执行所需的操作:< / p>

rideshare_data.each_with_object([]) do |(key, value), array|
  array << "#{key} earned #{value.sum { |ride| ride[:COST] }} total"
end.each { |total| puts total } 

# DR0001 earned 85 total
# DR0002 earned 75 total

在那里,您使用一个初始的空数组作为存储数据的备忘,在rideshare_data中的每个值上进行迭代,并求和,然后收集COST键的每个值并对它们求和。最后的each仅用于显示结果数组中的每个值。

根据您的Ruby版本,可能需要map和sum而不是sum(value.map { |ride| ride[:COST] }.sum)。