前田です。 # 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 -- 前田 修吾