我正在尝试编写类似于 If、else if、else 语句的东西。但是,在线编译器给我带来了问题。
我通常在 jquery 中编写我的代码并发出它......但这次我试图以 KRL 的方式来做它,我遇到了问题。
当我编写类似以下内容时(在 Pre 和 Post 块之间),我得到编译器错误:
if (someExpression) then { //做一些代码 } else { //做一些代码 }
我知道这是有原因的……但我需要有人向我解释……或者指向我的文档。
我正在尝试编写类似于 If、else if、else 语句的东西。但是,在线编译器给我带来了问题。
我通常在 jquery 中编写我的代码并发出它......但这次我试图以 KRL 的方式来做它,我遇到了问题。
当我编写类似以下内容时(在 Pre 和 Post 块之间),我得到编译器错误:
if (someExpression) then { //做一些代码 } else { //做一些代码 }
我知道这是有原因的……但我需要有人向我解释……或者指向我的文档。
使用 KRL,通常最好有单独的规则来处理您的问题中描述的“if...then”和“else”情况。这仅仅是因为它是一种规则语言。你必须改变你对问题的思考方式,而不是通常的程序方式。
也就是说,Mike 提出明确事件的建议通常是解决问题的最佳方法。这是一个例子:
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
语句中有 a 而另一个没有。这实现了相同的目的:
if (not ent:logged_in) then {
在Kynetx Docs上有更多关于后奏曲(fired
和notfired
,例如)的文档。我也喜欢 Mike 在Kynetx App A Day上写的更广泛的例子。
您可以在 pre 块中使用三元运算符进行变量赋值,如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所示/
这是 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;
}
}
}