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は初期化され、データが取り込まれています。2 つの配列は、メモリ内の異なるオブジェクトです。

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.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 に答える
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 に答える