是否有可以重载的 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
.
我在 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
.