青山です。

On Thu, 4 Nov 1999 14:54:26 +0900,
ttate / jaist.ac.jp wrote:

> そうですね。それでも動作はするのですが
> オブジェクトをいっぱい作りたい時に、
> 
> class Foo
>   def initialize(callback)
>     @callback = callback
>   end
>   .......
> end
> 
> for n in 0..10
>   objs[n] = Foo.new(proc{n})
> end
> 
> のようなことをしたかったので、残念ながらこの方法では
> a[x]のたびにFooObjのオブジェクトがつくられてしまいます。

なるほど。オブジェクトを事前に生成して入れておきたいという事なら、call
した結果を入れるようにするとローカル変数のスコープに悩まなくて済みますよ。

$ ruby -e '
objs = Array.new(10)
class Foo
  def initialize
    @callback = yield
  end
  def call
    @callback
  end
end
for n in 0..10
  objs[n] = Foo.new{n}
end
p objs[1].call
p objs[10].call
'
1
10

$ ruby -e '
objs = Array.new(10)
class Foo
  def initialize(&callback)
    @callback = callback.call
  end
  def call
    @callback
  end
end
for n in 0..10
  objs[n] = Foo.new{n}
end
p objs[1].call
p objs[10].call'
1
10

$ ruby -e '
objs = Array.new(10)
class Foo
  def initialize(callback)
    @callback = callback.call
  end
  def call
    @callback
  end
end
for n in 0..10
  objs[n] = Foo.new(proc{n})
end
p objs[1].call
p objs[10].call
'
1
10

速度的には yield を使ったものが最も速いです。


-- 
青山 和光 Wakou Aoyama <wakou / fsinet.or.jp>