最近いじってたスクリプトでの話.

クラスで適当に選択肢を抱えておいて,インスタンス生成時にそれを使うとい
うことを考えました.具体的には

    class Foo
      <var> = [:foo, :bar, :baz]
    
      def initialize
        @alternatives = <var>
      end
    end
    
という形.これだけだったら <var> としては Constant か @@class_variable 
を使うことができます.それはそれでいい.


問題は,親クラスのメソッドでこんな感じの定義をしつつ,子クラスでは
<var> のみを書きかえたいという場合.つまり上記の Foo に対して

    class Bar < Foo
      <var> = [:goo, :car, :caz]
    end

とだけして,bar = Bar.new で bar の @alternatives が [:goo, :car,
:caz] になって欲しい.


<var> として Constant を使うと Bar での書きかえは効きません.
Foo#initialize として Foo::Constant を見てしまう.

一方 @@class_variable だとどうかといえば,今度はもう一つ別のクラスを作っ
たら破綻してしまう.

# Foo を含む子クラス全てで共有されるから,それぞれが個別の値を持てない.


結局クラスのインスタンス変数を使って

    class Foo
      @alternatives = [:foo, :bar, :baz]
    
      def Foo.new
        super(@alternatives)
      end
    
      def initialize(alt)
        @alternatives = alt
      end
    end
    
    class Bar
      @alternatives = [:goo, :car, :caz]
    end

というようなコードを書いたのですが,何かもうちょっとましなやり方ってな
いものでしょうか?

# 何か勘違いしてるだけっていうのが簡単でいいな....

# ちなみに <http://www.dm4lab.to/~kjana/ruby/ror.tar.gz> なんてのが実
# 際のコード.テストがちゃんと動いてるのかどうかまともに確認してないし,
# だいたい完成してもえらく効率が悪いという難点あり :-P


-- 
柳川和久 @ 東大阪市 . 大阪府                                August 10, 2002
「え,月ってただ空に描いてあるだけじゃなかったの? うそー」
「うそーってエレン....」