KRL:如果那么其他问题

时间:2011-02-15 09:33:14

标签: krl

我正在尝试编写类似于If,else if,else语句的东西。但是,在线编译器给了我一些问题。

我通常在jquery中编写我的代码然后发出它......但是这次我试图以KRL方式进行编写,而我遇到了问题。

当我写下面的内容(在Pre和Post块之间)时,我遇到了编译器错误:

if(someExpression)然后{   //做一些代码 } else {   //做一些代码 }

我知道有一个原因......但我需要有人向我解释......或者指出我的文档。

3 个答案:

答案 0 :(得分:4)

对于KRL,通常最好使用单独的规则来处理问题中描述的“if ... then”和“else”情况。那只是因为它是一种规则语言;你必须改变你对这个问题的思考方式,从通常的程序方式来看。

也就是说,迈克提出的提出明确事件的建议通常是解决问题的最佳方法。这是一个例子:

ruleset a163x47 {
  meta {
    name "If-then-else"
    description <<
      How to use explicit events to simulate if..then..else behavior in a ruleset.
    >>
    author "Steve Nay"
    logging off
  }
  dispatch { }
  global { }

  rule when_true {
    select when web pageview ".*"

    //Imagine we have an entity variable that tracks
    // whether the user is logged in or not
    if (ent:logged_in) then {
      notify("My app", "You are already logged in");
    }

    notfired {
      //This is the equivalent of an else block; we're sending
      // control to another rule.
      raise explicit event not_logged_in;
    }
  }

  rule when_false {
    select when explicit not_logged_in

    notify("My app", "You are not logged in");
  }
}

在这个简单的例子中,除了在not语句中有if而另一个没有if (not ent:logged_in) then { 之外,编写两个相同的规则也很容易。这完成了同样的目的:

fired

Kynetx Docs上有关于后缀(例如notfired和{{1}})的更多文档。我也喜欢迈克在Kynetx App A Day上写的更广泛的例子。

答案 1 :(得分:3)

您可以在前块中使用三元运算符进行变量赋值,如http://kynetxappaday.wordpress.com/2010/12/21/day-15-ternary-operators-or-conditional-expressions/

所示

您还可以根据是否触发操作块有条件地引发显式事件,如http://kynetxappaday.wordpress.com/2010/12/15/day-6-conditional-action-blocks-and-else-postludes/所示

答案 2 :(得分:2)

以下是Sam发布的一些代码,解释了如何使用defactions来模仿ifthenelse行为。这个天才的所有功劳都属于Sam Curren。这可能是你能得到的最佳答案。

ruleset a8x152 {
  meta {
    name "if then else"
    description <<
        Demonstrates the power of actions to enable 'else' in krl!
    >>
    author "Sam Curren"
    logging off
  }

  dispatch {
    // Deploy via bookmarklet
  }

  global {
    ifthenelse = defaction(cond, t, f){
      a = cond => t | f; 
      a();
    };
  }

  rule first_rule {
    select when pageview ".*" setting ()
    pre { 
        testcond = ent:counter % 2 == 1;
    }
    ifthenelse(
        testcond, 
        defaction(){notify("test","counter odd!");}, 
        defaction(){notify("test","counter even!");}
    );
    always {
        ent:counter += 1 from 1;
    }
  }
}