在Ruby中将默认值定义为数组会导致值被覆盖

时间:2018-02-27 21:44:19

标签: arrays ruby hash

我正在研究一些带有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 address12的用户,则每个用户的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

所以我的问题是 - 为什么我所有的目标对象都被最后指定的对象所取代?

1 个答案:

答案 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