From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1997-09-18T13:57:13+09:00 Subject: [ruby-list:4400] Re: BranchTable class けいじゅ@日本ラショナルソフトウェアです. In [ruby-list :04382 ] the message: "[ruby-list:4382] BranchTable class ", on Sep/18 09:00(JST) Yasunari Momoi writes: >ももちゃん@アルモニコスです. >必要に迫られて,BranchTable という (汚い (^^;)) クラスを書いて >みました.もっとうまい方法があったら教えて下さい. 何かバグの話しが出ていて本論からずれてしまいましたね(^^;;; 最近, 似たようなクラスを作ったのでそれを元にエレガント(だと私が思って いる)な実装を紹介します. class BranchTable def initialize @__table = [] @__debug = FALSE return super end def def_rule(pat) @__table.push [pat, porc] end def execute(__line) print "debug:", __line, "\n" if @__debug for rule in @__table unless (match = __line.scan(rule[0])).empty? return rule[1].call(match) end end end end 使い方は今な感じですね. tbl = BranchTable.new tbl.def_rule(/^bye$/i){0} tbl.def_rule(/^put (.*)$/i){|match| print match[0], "\n"; 1} tbl.def_rule(/^hoge/i){print $foo, "\n"; "HOGE"} tbl.def_rule(/^(.*)$/i){|match| print $foo, ":", match[0], "\n"; 2} # 実行はしていないので, このままでは動かないかも? このクラスの味噌は, 一度にルールを定義しないでdef_ruleを用いて1つづつ 定義していくところですね. こうすると, イテレータブロックが長くなっても それほど見づらくはならないと思います. イテレータを用いていますので, ローカル変数はdef_ruleをしたところになり ますので, ももちゃん@アルモニコスさんのクラスとは全く同じ動作をしませ んが... __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@bc.mbn.or.jp <<---