我有以下代码:
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.emotion
和Chime.category
正在做的事情非常无关紧要,但要知道它根本没有访问comment_array
。它只在x
上工作,comment_array_altered
是数组puts comment_array
中的一个对象。这就是我i
he
时发生的事情:
comment_array_altered
正在更改原始数组以删除标点符号,整数,并使所有单词都为小写。有没有解释为什么会这样?对于它的价值,这正是Chime gem正在做的事情(删除标点,整数,并使单词小写)但是gem不应该在这个数组上运行,只能在{{1}}上运行。
答案 0 :(得分: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
会将它们复制为新对象。
答案 1 :(得分: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
Chime gem可能正在处理你传递给它的引用,你可能想要改变 copy 。这就是dup
的用途。
顺便说一下,你可以像这样重写代码:
comment_array = ['I.', 'He6']
emotions_array = comment_array.map { |x| Chime.emotion(x.dup) }
polarity_array = comment_array.map { |x| Chime.category(x.dup) }
答案 2 :(得分:1)
comment_array.each do |comment|
comment_array_altered << comment
end
将引用推送到新数组中。对这些进行更改将改变原始数据。
似乎emotion()
和category()
正在修改传递给它们的引用参数,这会导致发生这种情况。
这应该解决它:
comment_array.each do |comment|
comment_array_altered << comment.dup
end