あおきです。

  In mail "[ruby-list:28265] Re: Bignum に Bug?"
    "DP." <program-zero / ma4.seikyou.ne.jp> wrote:

> です。何故に |n,x| の n に self が渡されているのか非常に謎です。また、
>  @proc = &proc
> としておいて、test 関数内で
>  instance_eval(&@proc)
> としてやっても同じ結果でした。
> 
>  恐らく、パラメタ持ちのイテレータを instance_eval すると引数が変なことに
> なるようです。(リファレンスにも、 instance_eval をイテレータで使う場合
> 引数の受け渡しには触れられていません)

いや、これで正しい動作です。二重に proc を使ってるから面倒な
ことになってるんで、一個ずつ追っていけばわかります。まず

  def test(n,x)
    @proc.call(n,x)
  end

で呼ばれるのは

  def initialize(n,x)
    @proc=proc{instance_eval(&proc)}
  end

の外側の proc{} です。つまり

    proc { .... }.call( n, x )

となり、このブロックにはブロック引数がないのでこの時点で n, x は
捨てられます。そのあと .... の部分が実行されますがこれは

    instance_eval(&proc)

で、&proc は new にあたえられたブロック、つまり
   
    {|n,x| p self;p n;p x}

です。あわせると

  instance_eval {|n,x| p self;p n;p x}

となります。instance_eval はもともとそのコンテキストの self を
yield するので

  n, x = self

が実行されて n = self; x = nil になります。ようするに、二重に
proc を使うと外側のブロックに引数を渡しても内側のブロックには
関係ないというところが意図と違う原因でしょう。

たぶんやりたいのであろうことを書くには…うーん、どうすればいいかな。
一番簡単なのはこれかな?

  class Test
    def initialize( &block )
      @init_block = block
    end

    def test
      instance_eval( &@init_block )
    end
  end

  n = 0
  x = 1
  Test.new { p self; p n; p x }.test

-------------------------------------------------------------------
青木峰郎