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