jasagiri @ ウィキ
rulebyインタフェース解説
最終更新:
jasagiri
Rulebyは、ルールを定義して事実を検証するために純粋なRuby の ドメイン特化言語(DSL)をシステムへ提供します。
このインタフェースはDSLsを作成するのに適したRubyの言語機能を利用します。
次はRulebyルールの例です。
rule [m.status == :HELLO] do |v| puts v[:m].message end
この例では、 プロダクションの左側(「いつ」)は Array パラメータで表されています。右側(「そのとき」)はブロックで表されています。 この規則は、:HELLO の status がオブジェクトの事実のコレクションに存在しなければならないと断言します。オブジェクトがワーキングメモリに追加されたなら、プロダクションルールの右側で指定された「動作」は発火するでしょう。
さて、このルールがどのように使われるか見てみましょう。:
engine :hello_engine do |e| HelloWorldRulebook.new(e).rules assert e, Message.new(:HELLO, 'Hello World') e.match end
この‘HelloWorld’ルールは HelloWorldRulebook クラスを含んでいます(これはソースコードにあります)。このクラスを使って新しいインタフェースエンジンや新しいルールセットや新しい事実を作ります。 ‘assert’ メソッドはワーキングメモリに事実を追加します。 match メソッドが呼び出されたとき、 the action in the ‘HelloWorld’ ルールのアクションは発火します。そしてシステムのコンソールに出力するでしょう。:
Hello World
さて、もう少し動作を追加して、ルールブックに2つ目のルールを導入しましょう。:
rule [m.status == :HELLO] do |v| puts v[:m].message v[:m].message = "Goodbye world" v[:m].status = :GOODBYE modify v[:m] end
rule [m.status == :GOODBYE] do |v| puts v[:m].message end
match メソッドが呼ばれたときに出力されるでしょう:
Hello World Goodbye
何故なら、ワーキングメモリの事実が最初のルールの動作によって変更され、‘Goodbye’ルールを満足するようになったからです。
他にも Ruleby インタフェースでできる事がたくさんあります。 詳しい情報のためにRulebyDSLを読んでください。