【问题标题】:Looping over Ruby hash and accessing values循环遍历 Ruby 哈希并访问值
【发布时间】:2018-07-16 16:51:03
【问题描述】:

我对 Ruby 还很陌生,找不到合适的答案来回答我的问题。假设我有哈希命名 users_hsh = {}。 我正在遍历数据库中的所有用户并创建以下内容。

users.each do |user|
     users_hsh[user.full_name] = {
         completed_activities: some_integer_value,
         active_activities: some_integer_value,
         future_activities: some_integer_value
     } 
end

现在,我创建了一个名为 total_sum_not_zero_user_hsh = {}。 我想遍历 users_hsh 中的所有用户并检查每个用户是否完成的活动 + 活动活动 + 未来活动的总和不等于 0,如果这个条件成立,我想将此用户添加到 total_sum_not_zero_user_hsh。我已经完成了以下操作,但似乎这不起作用。

users_hsh.each do |usr|
    if usr.values.sum != 0
        total_sum_not_zero_user_hsh[usr] = {
            completed_activities: some_integer_value,
            active_activities: some_integer_value,
            future_activities: some_integer_value
        }
    end
end

我做错了什么?提前致谢!

【问题讨论】:

  • 你能分享users_hsh中的值吗?只要值的格式就足够了。
  • 当然,一个例子 users_hsh["Elvin Jafarli"] = {completed_activities: 10, active_activities: 2, future_activities: 0}。

标签: ruby-on-rails ruby


【解决方案1】:

让我们用你的例子:

users_hash = {
  "Elvin Jafarli" => {
    completed_activities: 10,
    active_activities: 2,
    future_activities: 0
  }
}

仔细考虑您的数据结构实际上是什么:它是将用户名映射到某些用户属性的哈希。如果您遍历这些值,您不仅会得到 usr,还会准确地返回这个映射。

描述性地命名变量会很有帮助:

users_hsh.each do |user_name, user_attributes|
  if user_attributes.values.sum != 0
    # ...
  end
end

通过您的尝试,您会看到如下错误:NoMethodError: undefined method 'values' for #<Array:0x00007fe14e22f538>。发生的事情是每个usr 实际上是一个Array 例如:

["Elvin Jafarli", {completed_activities: 10, active_activities: 2, future_activities: 0}]

【讨论】:

  • 谢谢!这就是我一直在寻找的。干杯!
  • 我建议使用pry 之类的工具在代码中放置断点并调试这样的问题。检查故障点的变量。
  • 谢谢!我想知道如何在 ruby​​ 中进行调试。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 2016-02-27
  • 2016-08-20
  • 2013-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多