前田です。
# ruby-listに振ります。

>もちろん、他の使い道もあるのでしょうが、Rubyの場合、文法で
>once functionをサポートするほどのことはないように思います。
># なぜなら、EiffelよりRubyの方が自由度が高いから:-)

一応ユーザレベルでの実装例を出しておきます。
メール末尾に添付したonce.rbを使えば、

require "once"

class Foo
  def initialize
    @val = 1
  end

  def_once :foo do
    @val += 1
  end
end

f = Foo.new
p f.foo #=> 2
p f.foo #=> 2
p f.foo #=> 2

などということができます。

ただ、instance_evalを使っているため、ブロックパラメータを
渡す事が出来ないのですが、once functionでパラメータを使用
することはないと思うので、許してください。

--
前田 修吾
----------
# once.rb

class Object
  ONCE_METHODS = []

private
  def def_once(name, &body)
    if name.kind_of? Integer
      name = name.id2name
    end
    id = ONCE_METHODS.length
    ONCE_METHODS.push(body)
    def_once_i(name, id)
  end
    
  def def_once_i(name, id)
    eval %{
      def #{name}
	def self.#{name}; @__#{name}__; end
	@__#{name}__ = ONCE_METHODS[#{id}].call
      end
    }
  end
end

class Module
private
  def def_once_i(name, id)
    module_eval %{
      def #{name}
	def self.#{name}; @__#{name}__; end
	@__#{name}__ = instance_eval(&ONCE_METHODS[#{id}])
      end
    }
  end
end

--
前田 修吾