ふなばです。

>本質的には同じでかまわないということでしたら,Module#attrの
>ような「メソッドを追加するメソッド」を用意すればよいわけです
>から,evalなどを使って隠すことが出来るかも知れません.

ちょっとだけ書きましたけど、イテレータをつかったものはやってみたんです。

  def foo
    once('foo') do
      安くない処理
    end
  end

といったふうにつかうもので、ようするに eval してるんですけど。散々お世
話になっている eval なんですが、なんとなく避けたい気分てものがあるみた
いなんですねえ。とりあえずデッチあげた once はこんな感じでした。

  def var(x)
    '@' + x.sub(/\?/no, '_p')
  end

  def once(*xs)
    for x in xs
      y = var(x)
      eval "def self.#{x}; #{y} end"
    end
    ys = xs.collect {|x| var(x)}.join(',')
    eval "#{ys} = yield"
  end

--Tadayoshi "once in a runtime" Funaba