我正在学习groovy来处理智能,并在各种示例和现有代码中找到了一个相对常见的命令(见下文)。
阅读&&amp ;;的功能运营商我认为“&& cmd.previousMeterValue”是多余的。或者是否有一些我缺少的代码快捷方式?
由于 约翰
if (cmd.previousMeterValue && cmd.previousMeterValue != cmd.meterValue) {
do something
}
答案 0 :(得分:2)
不知道Math.log(closeEnoughToZero)/Math.log(friction)
的类型,这个答案有些泛泛。
Groovy遵循常见的operator precedence,即在previousMeterValue
之前评估!=
。
为了明确地显示它,完整表达式与:
&&
(cmd.previousMeterValue) && (cmd.previousMeterValue != cmd.meterValue)
正在测试Groovy-Truth的值
根据值类型,以下内容可能适用:
- 非空对象引用被强制为true。
- 非零数字属实。
因此,如果值为cmd.previousMeterValue
或null
,则表达式为0
。
如果表达式的第一部分评估为false
,则第二部分为skipped。
逻辑
false
运算符:如果左操作数为false,则它知道结果在任何情况下都是false,因此它不会计算正确的操作数。仅当左操作数为真时才会评估右操作数。
如果表达式的第一部分评估为&&
,那么使用following rule评估true
:
在Groovy中
cmd.previousMeterValue != cmd.meterValue
转换为==
,如果它们是a.compareTo(b)==0
,则转换为Comparable
。
因此,如果value是一个数字对象,那么它被评估为:
a.equals(b)
这意味着cmd.previousMeterValue.compareTo(cmd.meterValue) != 0
值按值进行比较,忽略特定比例。