2017-02-15 64 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項目之前創建這樣價值就會在它裏面,爲什麼不呢? Ruby中的操作順序是什麼?如何複製該數組並使其在下一部分代碼中有用?

+0

你能告訴我們什麼'groups_data'看起來像之前複製arr?沒有看到它的格式,有點難以遵循。另外,你能解釋你想要完成什麼/最終結果應該是什麼? Ruby中有很多快捷方式,並且可能有更簡潔更方便的表達方式。 – Glyoko

+0

groups_data array 'groups_data = [[「group1」,「user_1」,「user_2」,「user_3」],[「group3」,「user_1」],[「group4」,「user_2」]]' 我想在下一部分代碼中使用該數組,但我仍然可以在0中得到刪除項的新數組,如上面代碼中所示。 – mila002

回答

1

temp_group_dataarr,你呼籲delete_at(0)arr相同陣列。這是以多種不同方式訪問的相同數據。

這裏發生的事情的一個簡單的例子:

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

最簡單的變化也只是把它變成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