※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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を読んでください。