0

我有以下代码:

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

正在更改原始数组以删除标点符号、整数,并使所有单词都小写。有什么解释为什么会这样吗?值得一提的是,这正是 Chime gem 正在做的事情(删除标点符号、整数和使单词小写),但 gem 不应该在这个数组上运行,只能在comment_array_altered.

4

3 回答 3

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在元素上使用会将它们复制为新对象。

于 2013-10-18T19:27:11.207 回答
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 可能正在处理您传递给它的引用,而您可能想要一个更改的副本。这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) }
于 2013-10-18T19:19:02.620 回答
1
comment_array.each do |comment|
  comment_array_altered << comment
end

正在将引用推入新数组。对这些进行更改将改变原始数据。

似乎emotion()并且category()正在修改传递给它们的参考参数,这将导致这种事情发生。

这应该解决它:

comment_array.each do |comment|
  comment_array_altered << comment.dup
end
于 2013-10-18T19:20:35.400 回答