From: Jun'ya Shimoda Date: 2010-09-30T22:42:05+09:00 Subject: [ruby-list:47498] Bignumの変換のタイミングについて --------------010208090700080801020101 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit 下田と申します。お世話になっております。 前回に引き続き、Twitterアプリを制作中なのですが 大きな整数の比較をするときに 妙な挙動が見られたので、相談させてください。 Rubytterでフォローしている相手の一覧を取得する際に friendsという関数を使うのですが 1回当たりの最大取得件数が100件なので 100以上フォローしている人の一覧を取得するために cursorという機能を使っています。 すると戻り値の構造体の中に next_cursor=1345195858263188001 next_cursor_str="1345195858263188001" という値が(例えば)入ってきます。 http://www.ruby-lang.org/ja/man/html/Fixnum.html によると 「ほとんどのマシンでは 31 ビット幅です。 演算の結果が|Fixnum| の範囲を越えた時には 自動的にBignum に拡張されます。」 という記載があります。 31bit幅とは 256^4 = 4294967296 よりは小さいのかなと思っています。 なので、構造体のnext_cursorの値はBignumなのだろうと 推測しています。 そして以下のプログラムを作成したところ last = rubytter.friends(screen_name, :cursor => last ? last.next_cursor : -1) while last.next_cursor> 0 #問題点 sleep 60 friends.concat(last.users) last = rubytter.friends(screen_name, :cursor => last ? last.next_cursor : -1) end friends.concat(last.users) 2行目の「問題点」の行でFixnumを越えていると思われる値が入っていると 条件に合致せず、while文に入らないようです。 問題点の行を while last.next_cursor_str.to_i> 0 #問題点 に書き換えるとうまく動きます。 Bignumを比較する際には何らかの演算をしてからでないと いけないということなのでしょうか? ご教示のほどよろしくお願いします。 -- A A Name : 下田 純也 (Jun'ya Shimoda) (o'.'o) _/ e-mail : jun-shimo@nifty.com (> ~<)/ Web : http://jironbach.iobb.net/ Twitter: http://twitter.com/JironBach/ --------------010208090700080801020101--