[#47529] ruby1.9.2 にて、 IO#reopen で第2引数を省略したときにモードが引き継がれない — jugyo kohno <kkohno@...>

jugyo と申します

11 messages 2010/10/08
[#47562] Re: ruby1.9.2 にて、 IO#reopen で第2引数を省略したときにモードが引き継がれない — "Y. NOBUOKA" <nobuoka@...> 2010/10/15

信岡です。

[#47537] Excel用のxmlssファイルを作成するライブラリ exlap_c — "YOSHIIZUMI" <t-yoshiizumi@...>

 吉泉といいます。

11 messages 2010/10/10

[ruby-list:47512] Re: Fwd: Re: Hashの制約について( Ruby1.8)

From: Shinya Kawaji <kawaji@...>
Date: 2010-10-02 12:56:12 UTC
List: ruby-list #47512
かわじ、です。


> ソースの一部を再掲すれば
> >>i = 0
> >>while i < friends.size
> >>	i_s = i.to_s
> >>	friends.delete( i_s.intern )
> >>	i = i + 1
> >>end
> >>puts "friends[:0] = #{friends['0'.intern]}"
> >>puts "削除されたi = #{i}"
> >>puts "削除後size = #{friends.size}"
> 0からハッシュのサイズまで削除するはずですがKISHIMOTOさんの
> 結果では半分しか消しこめていませんね。(削除されたi = 2500000 から)

「ハッシュのサイズまで削除するはず」のハッシュのサイズを、ループごとに
計算してしまっているのが、意図と反していると思います。


> >>while i < friends.size

の部分だけに注目すると、最初のループの時点では、i は 0 で、friends.size
は 5000000 ですよね。

次のループに入ると、i は 1 ですが、既に friends は一つ削除されていますの
で、friends.size は 4999999 となります。

これを繰り返すと、

  i : 0       <  friends.size : 5000000
  i : 1       <  friends.size : 4999999
  i : 2       <  friends.size : 4999998
  i : 3       <  friends.size : 4999997
  ...
  i : 2499999 <  friends.size : 2500001
  i : 2500000 == friends.size : 2500000

となって、半分の 2500000 の部分で、ループが終了します。

意図通り全ての friends を削除するためには、friends.size をループごとに
計算するのではなくて、最初に計算して、それを保持しておくべきです。

i = 0
f_size = friends.size
while i < f_size
  i_s = i.to_s
  friends.delete( i_s.intern )
  i = i + 1
end


> > 上田さんの環境ではこうならないということでしょうか?
> そうです。
> 私の環境では2097152となります。

これは原因は分かりかねるのですが、結果を全て書くと、以下のようになると
いう理解でよいのでしょうか。

size = 2097152
friends[:0] = 0
friends[:2097152] = 2097152
i = 2097152
friends[:0] =
削除されたi = 1048576
削除後size = 1048576
2度目の削除されたi = 5000000
2度目の削除後size = 0


In This Thread