&&
和and
之间的差异以及||
和or
之间的差异:
&&
和||
使用短路评估,而and
和or
始终计算每个条件
Kotlin doc for "and"
但除此之外,我在下面的示例中得到了不同的行为:
使用&&
时,这个代码片段可以完美地工作:
var str1: String? = "Good Morning"
var str2: String? = "How's it going"
if (str1 != null && str2 != null) {
println(str1.length + str2.length)
}
当我用and
替换&&
时,我必须在这两个条件周围添加括号,否则编译器似乎会感到困惑,因为我会得到错误:Operator '!=' cannot be applied to 'String?' and 'BigInteger'
个
使用and
并添加括号:
var str1: String? = "Good Morning"
var str2: String? = "How's it going"
if ((str1 != null) and (str2 != null)) {
println(str1.length + str2.length)
}
但最后一个片段抛出:
Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
这两个表达式不是应该做完全相同的事情吗?对两个条件求值,并且只在两个String
值都是non-null
时执行println
?这有什么区别?
1条答案
按热度按时间rdrgkggo1#
&&
与and
的另一个不同之处在于,它引入了从String?
到String
的智能转换,允许您通过说出str1.length
和str2.length
而不是使用str1?.length
和str2?.length
来访问length
。来自Kotlin语言规范:
智能造型由以下Kotlin构造引入。
if
)when
);?:
);?.
);&&
);||
);!!
);as
);is
);你需要额外的括号,因为
and
是中缀函数,比&&
有更高的优先级,后者不是中缀函数。