2013-10-18 26 views
0

我有以下代碼:紅寶石/ GEM改變陣列無緣無故

comment_array = ['I.','He6'] 
comment_array_altered = [] 

    comment_array.each do |comment| 
    comment_array_altered << comment 
    end 

    comment_array_altered.each do |x| 
    emotion_array << Chime.emotion(x) 
    polarity_array << Chime.category(x) 
    end 

puts comment_array 

什麼Chime.emotionChime.category正在做的是相當不相關,但知道這是不是訪問comment_array可言。它只能在x上工作,它是數組comment_array_altered中的一個對象。這是正在發生的事情,當我做puts comment_array

i 
he 

原始數組被修改,除去標點,整數,它使所有單詞小寫。有沒有解釋爲什麼會這樣?對於它的價值,這正是Chime gem正在做的事情(去除標點符號,整數和小寫字母),但該寶石不應該在此陣列上運行,只能在comment_array_altered上運行。

+0

你應該看看Chime gem的源代碼。 –

回答

1

試試這個:

comment_array = ['I.','He6'] 
comment_array_altered = [] 

    comment_array.each do |comment| 
    comment_array_altered << comment.dup 
    end 

    comment_array_altered.each do |x| 
    emotion_array << Chime.emotion(x) 
    polarity_array << Chime.category(x) 
    end 

puts comment_array 

磬寶石可能做的東西跟你傳遞給它的引用,你可能想要一個改變副本代替。這就是dup的用途。

BTW,你可以重寫代碼:

comment_array = ['I.', 'He6'] 
emotions_array = comment_array.map { |x| Chime.emotion(x.dup) } 
polarity_array = comment_array.map { |x| Chime.category(x.dup) } 
+0

Chime gem必須用引用來做東西 - 對Ruby來說是新的我沒有意識到引用和引用副本之間的區別,但'.dup'是有意義的。感謝您的提示,併爲+1重寫。它完美的作品。 – Luigi

1
comment_array.each do |comment| 
    comment_array_altered << comment 
end 

是推動引用到新陣列。對這些進行更改將會改變原始數據。

看起來emotion()category()正在修改傳遞給它們的引用參數,這會導致這種事情發生。

這應該修復它:

comment_array.each do |comment| 
    comment_array_altered << comment.dup 
end 
2

這裏是如何找出發生了什麼:

comment_array = ['I.','He6'] 
comment_array_altered = [] 
comment_array.each do |comment| 
    comment_array_altered << comment 
end 

在這一點上,comment_array_altered已初始化和填充。這兩個數組是不同的對象存儲:

comment_array.object_id # => 70148571674460 
comment_array_altered.object_id # => 70148571820360 

這裏是對象中comment_array

comment_array.map{ |o| o.object_id } 
# => [ 
#  [0] 70148571674600, 
#  [1] 70148571674540 
# ] 

而且這裏的對象中comment_array_altered

comment_array_altered.map{ |o| o.object_id } 
# => [ 
#  [0] 70148571674600, 
#  [1] 70148571674540 
# ] 

注意的元素同樣的object_id

正如其他答案指出的那樣,在元素上使用dup會將它們複製爲新對象。

+0

感謝您的解釋。這些故障排除提示是我需要學習的。同時,stackoverflow.com! – Luigi

+0

知道如何查看對象的ID是一種非常有用的事情,這些怪異。我是學習使用調試器的非常重要的信徒,它讓你深入瞭解你的代碼和變量。我們團隊中的每個人都會大吃一驚,「你在調試器中看到了什麼?」當他們問我爲什麼不起作用時,無論是Ruby,Perl還是其他。 –