Ruby / Gem改变阵列没有明显的原因

时间:2013-10-18 19:11:07

标签: ruby arrays 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 时发生的事情:

comment_array_altered

正在更改原始数组以删除标点符号,整数,并使所有单词都为小写。有没有解释为什么会这样?对于它的价值,这正是Chime gem正在做的事情(删除标点,整数,并使单词小写)但是gem不应该在这个数组上运行,只能在{{1}}上运行。

3 个答案:

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