4

私の個人的なプロジェクトの1つに次のコードがあります。

def allocate(var, value) # Allocate the variable to the next available spot. 
  @storage.each do |mem_loc|
    if mem_loc.free?
      mem_loc.set(var, value) # Set it then break out of the loop.
      break
    end
  end
end

ストレージアレイの各アイテムは、freeに応答するオブジェクトですか?と設定します。私がやろうとしているのは、配列を循環して、変数を設定する次の空の(空の)オブジェクトを探すことです。私の問題は、これはすべてのオブジェクトを循環してすべてを設定することです。ブレーク機能を間違って使用していますか?

それをテストして、私は次のように呼びます:

store.allocate(:a, 10)
store.allocate(:b, 20)

したがって、store [1]は:bおよび20に設定する必要があります。ただし、内容を出力すると、配列の残りの部分と同様に、値は10になります。

4

1 に答える 1

2

私は間違いを見つけたと思います、そしてそれは実際には上記のコードにはありませんでした。ストレージアレイをセットアップしたとき、私は次のようにしました。

@storage = [Memory_location.new] * 1000

それが1000の異なるオブジェクトを作成すると信じています。実際に起こったと思うのは、同じオブジェクトへの参照が1000個作成されたため、そのうちの1つを変更すると、すべてを変更したということです。これは、2つの異なる配列位置でputsメソッドを使用して証明でき、両方とも次のように返されます。

#{Memory_location:0x2bc8b74}
于 2010-08-12T10:31:58.780 に答える