我在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 ()
答案 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
。