有一个groovy逻辑非运算符(如unaryNot ..)可以重载

时间:2016-03-01 10:02:28

标签: groovy operator-overloading logical-operators

我在groovy中有一个Rule类,我可以重载<<,和,或者对于类实例,但如果我想写

Rule a = new Rule()
a<< {false }  //overloaded evaluate internal closure 

println !a // expect to get true - but you always get false

我无法找到那些时髦的逻辑&#39;不是&#39;运营商是。如果我打电话给&#39;!a&#39;因为我认为编译器正在使用&#39;是真的&#39;所以&#39;!a&#39;会是假的。

但我希望&#39;!a&#39;表示&#39;!(a.evaluate())&#39;对于这个班级

我该怎么做?

PS - 扩展 - 这里是我的规则类的虚拟模拟视图 - 删除了所有修剪 - 这可以在脚本中运行

class Rule {
    Closure  evaluate
    def leftShift (closure ) {
        this.evaluate = closure
    }


}

def r = new Rule ()
r << {false}

println "logical not of rule : " + !r
println " rule evaluate  : " + !r.evaluate ()

r << {true}
println "logical not of rule : " + !r
println " rule evaluate  : " + !r.evaluate ()

2 个答案:

答案 0 :(得分:0)

它不在文档中的Operator Overloading列表中。

认为你可以做的最好,重新使用其中一个可重载的。

也许如果你给出了一个可运行的例子,可以给出更具体的帮助。

因此,您可以重载其中一个可用的运算符,例如bitwiseNegate

将以下内容添加到Rule

def bitwiseNegate() {
    return !evaluate()
}

然后你可以这样做:

println ~r

答案 1 :(得分:0)

您可以覆盖asBoolean以映射到您的evaluate方法吗?

有了这个,你将拥有:

Rule rule = new Rule()
..
if (rule) { // rule.evaluate()
}

if (!rule) { // !rule.evaluate()
}

如果您有足够的冒险精神,可以实施自定义ASTTransformation,以便在语言中添加运营商。访问ClassNode以查找NotExpression并将此表达式转换为MethodCallExpression