けいじゅ@日本ラショナルソフトウェアです. In [ruby-list :04206 ] the message: "[ruby-list:4206] prime generator sample program ", on Sep/08 19:52(JST) toyofuku / juice.or.jp writes: > 豊福@パパイヤです。一から ruby 勉強中です。 > オブジェクトを使ったちょっと面白いプログラムを >思い出したので練習問題がてらに ruby で書いてみま >した。チェーン状につながったフィルタオブジェクト >を通すと合成数はふるい落とされていくというプログ >ラムです。 この題材は, 昔, 本の中で書いた例題(Smalltalkで記述)と基本的に同じもの だなと懐かしくなりました(^^;;; # 実は, mathn.rbのために, 同じものをruby版も作ったんですが, あまりにも # 遅いので, mathn.rb では別のアルゴリズムを採用してしまいました(^^;;; # 別にオブジェクト指向していませんが, アルゴリズムが面白いと思うので興 # 味があったら覗いてみて下さい. > 「こう書いた方が ruby らしい」など教えて下さい。 そうですね. まず, Enumeratableをincludeすることを考えると面白いと思い ます(Sieve#eachを実装する)そうすると, primes = Sieve.new(c) for n in primes break if n > max print n, "\n" end などの使い方ができるようになります. # ただ, loopは無限に続くので途中で確実に止まることが保証されていないと... 数えあげられるもの(Stream系)に関しては, Enumeratableをincludeできるか まず考えるとよいでしょう. 次に個別なことですが, 気になったところを1つだけ: >class Counter (中略) >if ! max = ARGV.shift; max = 100; end >max = max.to_i > >c = Counter.new(2) >s = Sieve.new(c) この辺りが美しくないですよね. cはSieve内部で使うものですからSieve.new の内部で設定したらいかがでしょう? __ ...............................石塚 圭樹@日本ラショナルソフトウェア... ----------------------------------->> e-mail: keiju / bc.mbn.or.jp <<---