【问题标题】:Ruby Type Error: no implicit conversion of Symbol into IntegerRuby 类型错误:没有将 Symbol 隐式转换为 Integer
【发布时间】:2019-01-19 15:46:24
【问题描述】:
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。帮助将不胜感激!

【问题讨论】:

    标签: arrays ruby hash nested typeerror


    【解决方案1】:

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

    no implicit conversion of Symbol into Integer (TypeError)
    

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

    由于您的rideshare_data 是一个散列,包含每个键(驱动程序 ID)的不同值,您可以迭代每个键值并获取每个 COST 键的值,然后执行您需要的操作:

    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 中的每个值,使用初始空数组作为存储数据的备忘录,使用 sum,您收集 COST 键的每个值并将它们求和。最后的each 只是为了显示结果数组中的每个值。

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

    【讨论】:

    • 这里可能只是map 而不是each_with_object([])? :)
    • 是的,没错,像rideshare_data.map { |key, values| [key, values.sum { |value| value[:COST] }] } 这样的东西也可以。
    猜你喜欢
    • 1970-01-01
    • 2014-03-12
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    相关资源
    最近更新 更多