是否有可以重载的 groovy 逻辑非运算符(如 unaryNot..)

is there a groovy logical not operator (like unaryNot..) that can be overloaded

我在 groovy 中有一个规则 class 并且我可以为 class 实例重载 <<, and, or 但如果我想写

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

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

我找不到 groovy 逻辑 'not' 运算符是什么。如果我调用 '!a',我总是得到错误,因为我认为编译器正在使用 groovy 'a' 的真相是 'true',所以 '!a' 将是错误的。

但我希望 '!a' 的意思是 '!(a.evaluate())' class

我该怎么做?

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

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 ()

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

想想你能做的最好的事情,就是重新利用其中一个可重载的。

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


因此您可以重载可用的运算符之一,例如 bitwiseNegate:

将以下内容添加到 Rule

def bitwiseNegate() {
    return !evaluate()
}

然后你可以做:

println ~r

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

有了这个,你将拥有:

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

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

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