groovy - 当两个变量相同时 && 如何工作?
问题描述
我正在学习 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
按值比较值,忽略特定的比例。
推荐阅读
- javascript - 监听调整大小事件时如何设置我的状态
- swift - Parse - 主密钥未经授权
- assembly - 将 64 位数据加载到 32 位寄存器中
- autohotkey - 为什么脚本停止工作?它应该工作
- html - 全渐变背景,顶部混合 svg 形状
- javascript - 如何将我的 getAttribute 属性添加到我的 localStorage
- python - 如何在 Django 中创建外键数组 - Postgresql
- python - return 函数在这里做什么?
- angular - 如何以角度启用严格传输安全 (HSTS)
- mysql - SQL 和/或 JPQL 语句检索按日期降序排序的单个记录