なかだです。 At Tue, 27 Feb 2001 12:17:33 +0900 正木 功<GEC01122 / nifty.ne.jp> wrote: > def [](n) > case $mod > when 0,1,3 > @list[n] || @list[n]=@proc.call(n,*@x) > when 2 > @list[n] || @list[n]=@proc.call(n,self,*@x) > end > end この例では instance_eval を使わなければならない理由は別にな いと思います。$mod == 2 のパターンでいいのでは。 > case $mod > when 0,3 > Prime =Sequence.new([2,3]){|n| (m=self[n-1]+2;m += 2 while self.find{|k| break > if k*k>m; m % k == 0};m)} インスタンス変数やプライベートが必要なわけでもありませんし、 ブロック外はと別の self がいきなり出てくるよりも、ブロックパラ メータで明示した方がわかりやすいのでは。 > when 2 > Prime =Sequence.new([2,3]){|n,s| (m=s[n-1]+2;m += 2 while s.find{|k| break if > k*k>m; m % k == 0};m)} 止まらなくなるのはここで m を変更しているからでしょう。 At Mon, 26 Feb 2001 14:04:38 +0900 "DP." <program-zero / ma4.seikyou.ne.jp> wrote: > しかし、 instance_eval を使って、外部のイテレータの中から直接内部の > インスタンス変数等の内部名を使用してもらうというのは、オブジェクト指向 > としてはあまり適切でない設計になるのかも知れません。ちゃんと隠蔽して > メソッドだけを使わせるなら例えば 設計的にもまずいですし、見えないところで self が換わっている とインスタンス変数やメソッドを取り違える危険性もあります。ブロッ クを定義するところと call するところが離れてしまうほどこの危険 性は増大すると思います。 # そういう点からすると instance_eval は今くらいでちょうどいい # のかも。 -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦