| 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(標準のフィルターメソッド)には次の機能が組みこまれています。
|
|---|