2017-02-15 38 views
0

Выполнение моего кода Я столкнулся с некоторыми трудностями, которые я совершенно не понимаю (я совершенно новый в Ruby). Это примерПоследовательность операций в Ruby

temp = [] 
temp_groups_data = [] 
search_text_user = %r{AD-|Domain} 
groups_data.each do |arr| 
    temp_groups_data << arr 
    arr.delete_at(0) 
    arr.each do |el| 
    temp << (el) unless el =~ search_text_user 
    end 
end 

Когда я пытаюсь использовать temp_groups_data массива в следующей части кода я получаю массив с удаляемым значением в 0. Я не понимаю, почему, потому что этот массив создаются до deteting пункта так что значение shuold быть в нем, почему нет? Какова последовательность операций в Ruby? Как дублировать этот массив и сделать его полезным в следующей части кода?

+0

Не могли бы вы показать нам, что 'groups_data' выглядит? Это немного сложно, не видя его формата. Кроме того, не могли бы вы объяснить, что вы пытаетесь выполнить/каков конечный результат? В рубине есть много ярлыков, и, вероятно, есть более короткий и более чистый способ выразить это. – Glyoko

+0

groups_data array 'groups_data = [[" group1 "," user_1 "," user_2 "," user_3 "], [" group3 "," user_1 "], [" group4 "," user_2 "]]' Я хочу использовать этот массив в этой форме в следующей части кода, но я все равно получаю новый массив с удаленным элементом в 0, как указано в приведенном выше коде. – mila002

ответ

1

arr в temp_group_data и arr вы звоните delete_at(0) на такие же массив. Это одни и те же данные, доступ к которым осуществляется разными способами.

Вот упрощенный пример того, что происходит:

x = [] 
y = [:a, :b] 
x << y 
p x #=> [[:a, :b]] 
y.delete_at(0) 
p x #=> [[:b]] 

Самое простое изменение будет просто скопировать arr, прежде чем положить его в temp_groups_data

temp = [] 
temp_groups_data = [] 
search_text_user = %r{AD-|Domain} 
groups_data.each do |arr| 
    temp_groups_data << arr.dup # this right here 
    arr.delete_at(0) 
    arr.each do |el| 
    temp << (el) unless el =~ search_text_user 
    end 
end 
+0

Хорошо, это работа. Итак, если я хорошо понял, что операция temp_groups_data = groups_data.dup выполняется до того, как каждая итерация также выдаст тот же массив? Что я должен помнить, дублируя объекты в следующий раз, я имею в виду более сложные массивы или хеши? – mila002

+0

См. [Этот вопрос] (http://stackoverflow.com/questions/38841444/using-self-dup-but-failing-rspec-test-to-not-modify-original-array) и [мой ответ на него] (http://stackoverflow.com/questions/38841444/using-self-dup-but-failing-rspec-test-to-not-modify-original-array/38841559#38841559), они могут помочь объяснить вещи лучше, чем я может сделать в комментарии. – philomory