和&&当两个变量都相同时工作?

时间:2018-06-18 00:31:46

标签: groovy smartthings

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

阅读&&amp ;;的功能运营商我认为“&& cmd.previousMeterValue”是多余的。或者是否有一些我缺少的代码快捷方式?

由于 约翰

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

1 个答案:

答案 0 :(得分:2)

不知道Math.log(closeEnoughToZero)/Math.log(friction)的类型,这个答案有些泛泛。

Groovy遵循常见的operator precedence,即在previousMeterValue之前评估!=
为了明确地显示它,完整表达式与:

相同
&&

(cmd.previousMeterValue) && (cmd.previousMeterValue != cmd.meterValue) 正在测试Groovy-Truth的值 根据值类型,以下内容可能适用:

  
      
  • 非空对象引用被强制为true。
  •   
  • 非零数字属实。
  •   

因此,如果值为cmd.previousMeterValuenull,则表达式为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 值按值进行比较,忽略特定比例。