1

这只是一个快速的问题。我在这里写了一个功能,它创建一个哈希,其中以开发人员名称作为键,他为他完成的每个功能得分的分数加在一起。但是我们确实有懒惰的开发人员不会将自己分配给任务,因此我们得到了以 nil 作为键的哈希值,我得到了 NoMethodError: undefined method `name' for nil:NilClass。什么是忽略零的干净方法?这是我的代码

feat_hash = {}
features.group_by {|dev| dev.developer.name}.each {|dev_id, feat| feat_hash[dev_id] = feat.inject(0){|sum, x| sum + x.points}}

提前致谢!:D

编辑:很酷,所以这是我运行它时得到的输出。您会注意到它通过具有已分配功能的 sprint 和那些为空的 sprint 进行渲染,但是一旦它进入带有未分配功能的散列,并以 nil 作为键,它就会出错。

         _________features___________
{"Gary"=>13, "Rob"=>8, "Hannes"=>8, "Sandra"=>1}
      ___________bugs_____________
{}
      __________chores____________ 
{}
*************** New Sprint ************************
     _________features___________ 
{}
     ___________bugs_____________
{}
     __________chores____________
{}
*************** New Sprint ************************
     _________features___________
{}
     ___________bugs_____________
{}
     __________chores____________
{}
*************** New Sprint ************************
 NoMethodError: undefined method `name' for nil:NilClass

然后是错误堆栈的其余部分

4

2 回答 2

1

你有这个错误,因为在指令dev.developer.name中,dev.developernil。您可以在group_by

features.reject {|dev| dev.developer.nil?}.group_by {|dev| dev.developer.name}.each { ...
于 2012-02-14T09:03:45.123 回答
0

这里使用了一个通用方法来try避免这种类型的错误。

feat_hash = {}
features.group_by {|dev| dev.developer.name}.try(:each) do |dev_id, feat|        
    feat_hash[dev_id] = feat.inject(0){|sum, x| sum + x.points}
end
于 2015-04-22T12:40:04.550 回答