0

我正在学习 groovy 来处理 smartthings,并在各种示例和现有代码中找到了一个相对常见的命令(见下文)。

阅读 && 运算符的功能,我认为“&& cmd.previousMeterValue”是多余的。还是我缺少一些代码快捷方式?

谢谢约翰

if (cmd.previousMeterValue && cmd.previousMeterValue != cmd.meterValue) {
do something
}
4

1 回答 1

2

不知道有什么类型previousMeterValue,这个答案有点笼统。

Groovy 遵循通用运算符优先级,即!=在之前进行评估&&
为了明确地显示它,完整的表达式与以下内容相同:

(cmd.previousMeterValue) && (cmd.previousMeterValue != cmd.meterValue)

cmd.previousMeterValue正在测试Groovy-Truth的值。
根据值类型,以下可能适用:

  • 非空对象引用被强制为真。
  • 非零数字为真。

因此,如果值为null0,则表达式为false

如果表达式的第一部分计算为false,则跳过第二部分。

逻辑&&运算符:如果左操作数为假,它知道在任何情况下结果都是假的,所以它不会计算右操作数。只有当左操作数为真时,才会计算右操作数。

如果表达式的第一部分计算为true,则cmd.previousMeterValue != cmd.meterValue使用以下规则计算:

在 Groovy中,如果它们是,则==转换为,否则。a.compareTo(b)==0Comparablea.equals(b)

所以如果 value 是一个数字对象,那么它被评估为:

cmd.previousMeterValue.compareTo(cmd.meterValue) != 0

这意味着BigDecimal按值比较值,忽略特定的比例。

于 2018-06-18T00:46:38.837 回答