TOP>>OBAQ>>オブジェクトオプション 概略ツアー<OBAQ>構成定義アプリケーションサーバリファレンスサイトマップ

オブジェクトオプションとは


オブジェクトオプション

基本的な使用法

ObjectOptionはクラスに外部から設定可能な「オプション」(属性)を持たせる クラスです。次のように使用します。

class A
  include ObjectOption
  def_option :aaa
end

a = A.new
a.set_option(:aaa, 1)
p a.aaa # => 1

def_option :aaaによって、 クラスAにaaaというオプションが定義されます。 Ruby標準のattr_readerと同じように、 この定義を行なうことによって、 クラスAに対してaaaというメソッドが定義され、このメソッドでオプション値を参照できます。

オプションに対する値の設定は set_option というメソッドで行ないます。

テキストからの値の設定(set_options)

オプションの値は次のように設定することもできます。

class A
  include ObjectOption
  def_option :aaa, :bbb
end

a = A.new
a.set_options("aaa=1 bbb=2")
p a.aaa # => 1
p a.bbb # => 2

既定値の設定

def_option_with_defaultというクラスメソッドを使用することで、 オプションに既定値を与えることができます。

class A
  include ObjectOption
  def_option :aaa
  def_option_with_default :bbb, 99
end

a = A.new
p a.aaa # => nil
p a.bbb # => 99
a.set_option(:aaa, 1)
a.set_option(:bbb, 2)
p a.aaa # => 1
p a.bbb # => 2

def_optionで定義したオプションの既定値はnilになります。

フィルターメソッド(option_set_filter)

オプションの設定の時には、option_set_filterというメソッドが呼ばれます。 このメソッドを再定義することで、 設定されるオプションの値を変更することができます。

class A
  def_option :date1
  def option_set_filter(name, val)
    if name == :date1
      val = Date.new(*ParseDate.parsedate(val)[0,3])
    else
      val = super
    end
    val
  end

end

a1 = A.new
a1.set_option(:date1, "2000-07-05")
p a1.date1.type  # => Date

このように、 与えられた文字列から適当なオブジェクトを生成して、 そのオブジェクトをオプションの値とすることができます。

このメソッドを利用して、データのチェックを行うこともできます。

class A
  def_option :month
  def option_set_filter(name, val)
    if name == :mounth
      case val.to_i
      when 1..12
       val = val.to_i
      else
       raise "monthに不正な値(#{val})を設定しています"
      end
    else
      val = super
    end
    val
  end
end

フィルターメソッド(option_get_filter)

オプションの参照時に動的にオプションの値を生成することもできます。

class A
  def_option :time
  def option_get_filter(name, val)
    if name == :time
      case val
      when Time
        val
      when "now"
        Time.now
      when  "yesterday"
        Time.now - 3600*24
      else
        raise "illeagal time"
      end
    else
      super
    end
  end
end

a1 = A.new
a1.set_option(:time, Time.at(100))  
p a1.time # => Thu Jan 01 09:01:40 JST 1970
a1.set_option(:time, "now")
p a1.time # => その瞬間の時刻が表示される

デフォールトフィルター

ObjectOptionのoption_get_filter(標準のフィルターメソッド)には次の機能が組みこまれています。

  • $XXXによるグローバル変数、環境変数の参照

    オプションの値が文字列で先頭の文字が'$'の場合、 これをグローバル変数と環境変数の参照とみなします。 まず、$XXXというRubyのグローバル変数を参照し、 その値がnilならば、XXXという環境変数を参照します。

    class Site
      def_option_with_default :pguser, "$LOGNAME"
    end
    
    s = Site.new
    p s.pguser # => ログイン名(環境変数LOGNAMEの値)が表示されます。
  • #{...}による、Rubyの式の評価

    オプションの値が文字列で、"#{...}"という形式で設定されている場合、 ...の部分をRubyの式とみなして、 その式を評価した値をオプションの値とします。

    class A
      def_option :aaa
    end
    
    a = A.new
    a.set_options("aaa=#{1+1}")
    p a.aaa # => 2

    なお、式の評価は、オプションの設定時でなく参照時に行なわれます。


ページトップへ