[#1058] ruby 0.99.3-961119 available — matz@... (Yukihiro Matsumoto)

まつもと ゆきひろです.

19 messages 1996/11/19
[#1059] segm fault (Re ruby 0.99.3-961119 available) — sinara@... 1996/11/19

原です。

[ruby-list:1145] [Q] include module

From: sinara@...
Date: 1996-11-29 12:47:23 UTC
List: ruby-list #1145
原です。質問です。

【1】モジュールをインクルードしても、すでにある関数/メッソッド
が再定義されないのはなぜでしょうか?

def f; print "main\n"; end
module A
  def f; print "module A\n"; end
end
f           #=> main
include A
f           #=> main

と、なるわけですよね。なぜ?と言われても困るかな。次の例だと再定
義されますね。

module Main
  def f; print "main\n"; end
end
module A
  def f; print "module A\n"; end
end
include Main
f           #=> main
include A
f           #=> module A


どうもモジュールの理解がいまひとつなんですが、この差はどこから
くるのでしょう。


【2】一群の関数 f1, f2, f3,... の定義を実行時に変えたい時に、い
い方法はあるでしょうか?

最初、モジュールで

module A
  def f1 ... end
  def f2 ... end
  ...
end

定義集を作っておいて

case mode
when 'A'
  include A
when 'B'
  include B
...
end

などとしたらうまくいくのではないかと思ったのですが、以前に既に
f1, f2, f3,.. が定義されているとだめなんですよね。

case mode
when 'A'
  f1, f2, f3,.. = proc{f1_A}, proc{f2_A}, proc{f3_A},...
when 'B'
  f1, f2, f3,.. = proc{f1_B}, proc{f2_B}, proc{f3_B},...
...
end

で、f1.call,.. を使うというのも、あまりスマートじゃない気がします。
エイリアスというのもあり得ますね。他にいい方法はないでしょうか。
---===-=-=-=-=-=-=-=-=======--=-=-=-==-=-===-=-=-=-=-=-=--=-==-=--
                            Shin-ichro Hara(Nagaoka Univ.of Tech.)

In This Thread

Prev Next