From: masaki Date: 2002-07-24T21:27:23+09:00 Subject: [ruby-dev:17806] Re: self in block 正木です。 From: nobu.nakada@nifty.ne.jp Subject: [ruby-dev:17776] Re: self in block Date: Tue, 23 Jul 2002 18:24:27 +0900 > 逆に、必要とする場合にinstance_evalなりdefine_methodなりするの > では何かまずいのでしょうか。「すべてのinitializeでselfが変わら > なければならない」という主張ではないですよね。 instance_eval は以前挑戦してみましたがうまく行かず、素人の使うものではない ということで以後試していません。 > > # 要1.7 > > class Sequence > def initialize(list=[], *parameter) > @list = list > @para = parameter > class << self > define_method(:lambda, proc) > end > end > > def [](n) > @list[n] ||= lambda(n, *@para) > end > end > define_method の方は、まだ 1.6.7 なので試せないのですが、上の定義 + 以下の script --------- class Sequence def each i=0 loop do yield(self[i]) i+=1 end end def find (r=nil;each{|x| if yield(x) then r=x;break;end};r) end end m=10 Prime = Sequence.new([2,3]){|n| m = self[n-1]+2 m += 2 while find{|k| break if k*k > m; m % k == 0} m } Prime.each{|prime| break if prime > m ;p prime} -------- は、私の元の Sequence で Prime =Sequence.new([2,3]){"|n| m=self[n-1]+2 m += 2 while find{|k| break if k*k>m; m % k == 0} m "} としたのと同じ結果 2 3 5 7 を出力してくれますか?