为什么我在 Ruby 中对嵌入在数组中的哈希进行迭代时出现 NoMethodError ?



我的代码不断收到以下错误消息。(尝试循环访问数组中嵌入的哈希以返回最大值及其关联的键)。错误出现在第一个循环之后。

回溯(最近一次调用): 6: from main.rb:53:in<main>' 5: from main.rb:53:inmap' 4: from main.rb:53:ineach' 3: from main.rb:53:intimes' 2: from main.rb:

58:inblock in <main>' 1: from main.rb:58:ineach ' main.rb:60:inblock (2 levels) in <main>': undefined method[]' for nil:NilClass (NoMethodError)

#assigns number of participants in array 
num_participants = 2 
#embedded hash within array (of participants)
participants = [{"participant_name"=> "Liz Lee", "cupcakes_sold" => 41, "cupcakes_left" => 31, "cakes_sold" => 12, "cakes_left" => 2}, 
{"participant_name" => "John Jay", "cupcakes_sold" => 44, "cupcakes_left" => 2, "cakes_sold" => 22, "cakes_left" => 4}] 
#calculates total amount raised by each hash in participants array
#and populates new hash key 'proceeds' for each hash in participants array
#then loops through to update most_raised amount and assign highest_earner
counter = 0
most_raised = 0
highest_earner = ""
num_participants.times.map do 
profits =  2 * participants[0 + counter]['cookies_sold']  - 
participants[0 + counter]['cookies_left'] - 
participants[0 + counter]['cookies_sold'] + 
6 * participants[0 + counter]['cakes_sold'] - 
3 * participants[0 + counter]['cakes_sold'] - 
3 * participants[0 + counter]['cakes_left']
participants[0 + counter]['proceeds'] = profits.to_i
puts "nProceeds raised by #{participants[0+counter]['participant_name'].capitalize}: 
$#{participants[0+counter]['proceeds']}" +"."
counter+=1
['participant_name', 'proceeds'].each do 
if (max < profits)
most_raised = participants[0+counter]['proceeds'].to_i
highest_earner = participants[0+counter]['participant_name']
end
end
end
puts "#{highest_earner.capitalize} raised the most:$#{most_raised}"

由于您设置了 counter=0,因此当您执行 members[0 + 计数器] 时,您永远不会超过第一个哈希值(它总是等于参与者[0])

我错过了你的计数器+=1 对不起,这个答案无关紧要。

解决方案:我分离了循环。

#calculates total amount raised by each participant
counter = 0
participants.each do 
profits =  2 * participants[0 + counter]['cookies_sold']  - 
participants[0 + counter]['cookies_left'] - participants[0 + counter]['cookies_sold'] + 6 * participants[0 + counter]['cakes_sold'] - 
3 * participants[0 + counter]['cakes_sold'] - 3 * 
participants[0 + counter]['cakes_left']
participants[0 + counter]['proceeds'] = profits.to_i
puts "ne[36mProceeds raised by #{participants[0+counter]['participant_name'].capitalize}:e[0m $#{participants[0+counter]['proceeds']}" +"."
counter+=1
end
#calculates highest earner and highest amount raised
counter = 0
most_raised = 0 
highest_earner = ""
participants.each do 
if (most_raised < participants[0+counter]['proceeds'])
most_raised = participants[0+counter]['proceeds'].to_i
highest_earner = participants[0+counter]['participant_name']
counter+=1
end
end
puts most_raised 
puts highest_earner

最新更新