ふなばです。

>|ちなみに、 僕は、Ruby がやるにしても、必ずしもそのための文法をとくに誂
>|えなくてもよさそうなものだ、と思っているんですが、どうなんでしょうか。
>|メソッド定義はそれとして、ふるまいについて指示する、というようなことっ
>|てできそうじゃないですか (だって自由度が高いんですもの :-)。対象となる
>|メソッドを間接呼び出して、値を得たら再びメソッドを定義しなおすメソッド
>|を Module に用意するってのはダメなのかなあ。
>
>ダメじゃないです.が,仕様をもう少し詰めるとrubyレベルで出来
>そうな気もします.もっともどの時点でもとのメソッドが定義され
>ているかって係わってくるんでちょっとややこしいですが.

前田さんのコードとまともとさんのヒントを頼りに、ためしに、とても簡単な
のを書いてみました (eval つかっちゃいました)。

# once.rb: Written by Tadayoshi Funaba 1998
# $Id: once.rb,v 1.1 1998/07/03 16:45:31 tadf Exp tadf $

class Module

  def once(id)
    name = id.id2name
    module_eval <<__ONCE__
    alias_method :__#{id}__, :#{name}
    def #{name}(*args, &block)
      def self.#{name}(*args, &block); @__#{id}__ end
      @__#{id}__ = __#{id}__(*args, &block)
    end
__ONCE__
  end

  private :once

end

#--

class Foo

  def foo
    ...
  end

  once :foo

end

てなふうにします。風呂あがりにちょろっと書いたんであやしい。

--Tadayoshi Funaba