我正在研究一些带有sending_destination
对象的代码(这些代码是关于如何向一组人发送一些数据的说明)。
sending_destination = MyApp::Model::SendingDestination.where(:id => some_id)
destination_hash = Hash.new{ |h,k| h[k] = [] }
sending_destination.each do |destination|
if destination.send_to_group?
group_users = destination.address # this retrieves n-number of `User` objects
group_users.each do |user|
destination[:address] = user.user_id
destination_hash[job_signature(destination)] << destination
end
end
end
上述代码接收destination
个对象,检索此用户的user_id
,并将其分配给destination
的{{1}}字段。因此,假设我有3个ID address
,1
和2
的用户,则每个用户的3
将变为1,2和3。
这是destination[:address]
:
job_signature
这只是根据private_class_method def self.job_signature(destination)
format = destination[:format]
"#{format}|#{!!destination[:apply_formatting]}|#{!!destination[:apply_vis]}|#{destination.id}"
end
中的属性生成一个字符串,然后是以下destination
的每个目标使用的密钥。
destination_hash
上面的代码行导致以下哈希值 - destination_hash[job_signature(destination)] << destination
值将在每个循环中递增,其中键为:address
且值为job_signature(destination)
。
destination
除了{"csv|false|false|1" => [
MyApp::Model::SendDestination {
: id => 1,
: scheduled_plan_id => 1,
: type => "email_group",
: format => "csv",
: address => "1",
: apply_formatting => false,
: apply_vis => false,
}]}
中的所有值(MyApp::Model::SendDestination
部分)被最后分配的destination_hash
对象替换外,其他所有内容似乎都正常工作。例如,可以预期分配的destination
个:address
分别为1,2 {3}。但是当我打印出destination
之外的destination_hash
时,所有.each
个对象都显示destination
为3。
以下是生成的:address
对象。如您所见,destination_hash
值全为:address
。相反,它应该是1,2和3。
3
所以我的问题是 - 为什么我所有的目标对象都被最后指定的对象所取代?
答案 0 :(得分:2)
问题似乎是当您将as.numeric(sub('½', ".5", my_vec))
[1] 85.5 75.0 73.0 91.5 93.5 68.5 74.0 94.5 81.5 67.5 96.5 71.0 84.5 96.5 64.5
[16] 84.5 82.5 81.5 94.5 74.5 76.5 73.0 69.5 83.0 81.5 85.5 76.0 77.0 81.0 92.5
推入destination
的其中一个值时:
destination_hash
你推送实际对象而不是副本(即通过引用而不是按值)。
这意味着当您在下一次迭代中更改destination_hash[job_signature(destination)] << destination
对象时:
destination
您可以在任何位置更改对象,包括上次推送它的位置。
尝试替换
destination[:address] = user.user_id
与
destination_hash[job_signature(destination)] << destination