From: keiju@... (Keiju ISHITSUKA) Date: 1997-09-16T12:33:00+09:00 Subject: [ruby-list:4327] Re: prime generator sample program けいじゅ@日本ラショナルソフトウェアです. In [ruby-list :04294 ] the message: "[ruby-list:4294] Re: prime generator sample program ", on Sep/12 19:05(JST) toyofuku@juice.or.jp writes: > 豊福@パパイヤです。 >> 通常のストリームの場合は, nextを実装することによっていろいろの機能が付 >> 加されるんですが, それとは違い, Enumeratableのeachは最後まで繰り返そう >> としますので, 無限に生成するストリームに対して, Enumeratableをインクルー >> ドするのは無理がないでもないですね. > > そうですね。to_a なんか無限ループになるからダメだし。 うーん. それはそうですね... >今のままの Sieve で使える Enumerable のメソッドは停止条件を >入れられる find くらいでしょうか。 > ex. > s.find {|p| p > 1500 || (a, b = (2**(p-1) - 1).divmod(p*p)) > b == 0 } あとは, このままでは, for が使えるのが嬉しいぐらいでしょうね. あとは, 以下のメソッドSieve#collectのようにリミットの指定ができるよう にしたり, breakした時点での配列をとりあえず返すようにoverloadするぐら いですね... class Sieve def collect ary = [] begin for prime in self break if prime > @limit ary.concat yield.prime end ensure ary end end end # 実行はしていません. >> rubyでは, スーパークラスは1つしか持てません. 一方モジュール >> は複数インクルードできますので, 抽象クラスになるものはモジュールにでき >> るかどうか検討する価値はあると思います. > > なるほど。メモ、メモ。 ただし, こだわると何でもモジュールになっちゃいますんで適度に(^^;;; >> * ライブラリとして使うには, Stream#out はいただけない. >> outという名前は深い意味があるのでしょうか? もしそうじゃなければ, もう >> ちょっと適当な名前に変えた方がよいかも知れません. 良く使う名前としては >> nextがありますが, rubyではnextは予約語(になる予定)なので使えません. > > 元ネタにした C++版での変数名、メソッド名をそのまま使い >ました。英語がネイティブの人が書いたプログラムのようでした >ので。 あくまでも, モジュールにした場合での話しですので(^^;;; それに良く考え たら, モジュールとしてはStreamはいただけないですね. やはり, Streamable かな? > 明日(13日)のセミナにぎりぎり申し込めました。 やはり, 実際に会うと思っていた雰囲気とちょと違うもんなんですねえ... __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@bc.mbn.or.jp <<---