ごとけんです

In message "[ruby-dev:8333] Re: constants definition in extarnal files"
    on 99/11/17, nagai / dumbo.ai.kyutech.ac.jp <nagai / dumbo.ai.kyutech.ac.jp> writes:
>なるほど.これなら少なくとも 1.4 系では OK のようですね.
># 1.5 系なら警告メッセージ?

あれれ、1.4.2 で例外あがりますですか??

>ただ,Kernel モジュールが相手となると,
>勝手にメソッドを追加するのは気が引けます.
>もちろん個人レベルで用いるなら問題はないのですが...
>ちょいとコンセンサスは取っといた方がよさそうです.

じゃ、ちょっとくどいですが Module のメソッドに戻してみました。

class Module
  def ConstantModule
    m = Module.new
    constants.each{|c|
      m.const_set(c, const_get(c))
    }
    m.module_eval do
      eval <<EOS
      def self.append_features(mod)
	self.constants.each{|c|
	  mod.const_set(c, self.const_get(c))
	}
      end
EOS
    end
    return m
  end
end

module M
  A = 0
  def foo; end
end

class Foo
  include M.ConstantModule
end
p Foo::A      #=> 0

class Foo
  A = 3       #!! warning
end
p Foo::A      #=> 3

>matz> 個人的にはこのような機能はPython同様、キーワード引数で実現し
>matz> ようと考えていました。つまり、
>      (以下略)
>
>という話も出てますし,現状は「保留」ということでしょうか?

よくは分かりませんが、今回の一連の定数トリックはキーワード引
数とは異なる要求も満たすのでこれはこれでもよいかも…

-- gotoken