まつもと ゆきひろ@トヨタケーラムです.

In message "[ruby-list:213] Re: TUTORIAL - procedure object"
    on 96/02/27, 石塚圭樹 <keiju / csg.mes.co.jp> writes:
|けいじゅ@事開事.三井造船です. 

|引数が複数ある時は? どうなるのでしょう?

こうですね.

 ruby> proc{|n1,n2| printf "0x%x 0x%x\n", n1, n2}.call(32,64)
 0x20 0x40

|Smalltalkですと, ブロック内の変数はそのブロックを定義している変数と同
|じになりますよね. rubyの場合も同じなのでしょうか? それとも, procにロー
|カルな変数が存在する?

スコープを共有している手続きオブジェクトはローカル変数も共有
します.

 ruby> i=0
 0
 ruby> p1 = proc{|j| i=j}
 #<Proc>
 ruby> p2 = proc{print i, "\n"}
 #<Proc>
 ruby> p1.call(5)
 5
 ruby> i
 5
 ruby> p2.call
 5
 nil

注意すべき点はふたつあります.

ローカル変数の共有はスコープから抜けても続きます.つまり,上
の例におけるp1, p2がスコープの外に渡されてもローカル変数iの
共有は続きます(この場合,p1,p2からしかアクセスできなくなる).

これも例をあげましょう.

 ruby> def foo
 ruby|   i = 15
 ruby|   get = proc{i}
 ruby|   set = proc{|n| i = n}
 ruby|   return get, set
 ruby| end
 ruby> p1, p2 = foo
 [#<Proc>, #<Proc>]
 ruby> p1.call
 15
 ruby> p2.call(2)
 2
 ruby> p1.call
 2

もう一つはイテレータブロックの中ではじめて現れた変数(最初の
例だとj)は共有されないことです.これはこの後「ローカル変数」
のところで説明します.