なかだです。

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はできる。
    中田 伸悦