小林です。

まつもと ゆきひろさんへの返信:

いやはや、作者自身に手取り足取り教えてもらえるなんて、
本当にありがとうございます。

> 下のような対応もできますし。
> 
>   class FixedArray
>     def initialize(size)
>       @size = size
>       @ary = Array::new(size)
>     end
>     def [](n)
>       if n < -@size or @size <= n
>         raise IndexError, "index out of range"
>       end
>       @ary[n]
>     end
>     def []=(n,v)
>       if n < -@size or @size <= n
>         raise IndexError, "index out of range"
>       end
>       @ary[n] = v
>     end
>   end
> 
>   shain = FixedArray(12)  # 小さい会社だな。
>
なるほど! あとは
   def resize(n)
       @size = size
   end
で必要ならばサイズを拡張できるということですね。
で、あつかましいようでちょっと気が引けますが
  @ary = Array::new(size)
のsizeは単に最初に領域確保して実行時間を早くする
ためなのでしょうか?
それと、 if n < -@size or @size <= n の '-@size' の意味
がよくわかりません。テストプログラムを実行すると配列
の上限から逆に辿っているようですが、きっと仕様なので
すね?
 
> |> freezeは一方通行です。一度凍らせたら一生凍ってます。
> |もし、meltがあれば配列をファイルやデータベースと同様に
> |lockしたりunlockできるし、スレッド間でfrozen?を使って
> |排他制御のような使い方も考えられるような気がします。
> 
> それはfreezeの使い方として正当ではないように思います。
>
あ、もし「スレッド間でfrozen?を使って排他制御...」の部分が
「正当でない」とお考えなら全くその通りでした。例えが不適切
でした。仮にfrozen?を使うにしてもMutex等と組合わせなけれ
ば危険ですね。ただ、やはり「lock/unlock」はあったらいいな
と思います。ある特定の処理中は配列の内容を変更しないの
で、もし変更されるような場合は例外でバグ検出ができます。
でも、これも頂いた例のように対応できますが...
 
> で、以前はなにか理由があって解凍できないようにしてたと思うん
> ですが、
思い出したら、教えてください。

> |untaintって?
> 
> Objectのメソッドでオブジェクトの「汚染」を取り除きます。
失礼しました、113頁に説明がありました(読んだはずなのに)。


小林 茂雄
E-Mail: shigeo / tinyforest.gr.jp
Home Page: http://www.tinyforest.gr.jp