ruby-on-rails – 在rails上的ruby中创建带键和值的动态哈希

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – 在rails上的ruby中创建带键和值的动态哈希前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用动态密钥和相应的值创建哈希.比如这样
  1. hash = {1 => 23.67,1 => 78.44,3 => 66.33,12 => 44.2}

像这样的1,2,12是数组索引.我希望这是可以理解的.我正在尝试使用ROR教程中的语法.

像这样

  1. test = Hash.new
  2.  
  3. for i in 0..23
  4. if (s.duration.start.hour == array[i].hour)
  5. s.sgs.each do |s1|
  6. case s1.type.to_s
  7. when 'M'
  8. test ={i => s1.power} # here I am trying to create hash like give example in which i is for loop value
  9. when 'L'
  10. puts "to be done done"
  11. else
  12. puts "Not Found"
  13. end
  14. end
  15. end
  16. end
  17. end

更新的代码

  1. test = Hash.new
  2. for i in 0..23
  3. if (s.duration.start.hour == array[i].hour)
  4. s.sgs.each do |s1|
  5. case s.type.to_s
  6. when 'M'
  7. puts s1.power;
  8. test[i] = s1._power
  9. when 'L'
  10. puts "to be done"
  11. else
  12. puts "Not Found"
  13. end
  14. end
  15. end
  16. end

结果

在遍历

  1. for t in 0..array.size
  2. puts test[t]
  3. end

结果:

  1. t = 68.6 # which is last value

并期待

  1. t = 33.4
  2. t = 45.6 etc

样本日志

  1. after assign {23=>#<BigDecimal:7f3a1e9a6870,'0.3E2',9(18)>}
  2. before assign {23=>#<BigDecimal:7f3a1e9a6870,'0.2E2',9(18)>}
  3. after assign {23=>#<BigDecimal:7f3a1e9ce550,'-0.57E2',9(18)>}
  4. before assign {23=>#<BigDecimal:7f3a1e9ce550,9(18)>}

如果有任何其他优化的解决方案,那将是非常感谢

解决方法

您将在每次迭代时使用新哈希重新分配测试.你应该添加它,而不是
  1. test ={i => s1.power}

你应该做:

  1. test[i] = s1.power

这将key i的值设置为s1.power

如果你想保留给定键的所有值的数组,我会建议以下(更多ruby-ish)解决方案:

  1. hour_idx = array.find_index { |item| s.duration.start.hour == item.hour }
  2.  
  3. values = case s.type.to_s
  4. when 'M'
  5. s.sgs.map(&:_power)
  6. when 'L'
  7. puts "to be done"
  8. else
  9. puts "Not Found"
  10. end
  11.  
  12. test = { hour_idx => values }

我在这里做的是:

>找到与当前s相关的hour_idx(我假设只有一个这样的项目)>根据s.type创建一个包含所有相关值的数组(如果它是’M’是s.sgs的所有_power的数组,’L’表示你需要的任何地图,否则为nil)>使用#1和#2中设置的值创建目标哈希…

猜你在找的Ruby相关文章