Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
'a?.let{}?:run{}'在Kotlin中是惯用语吗?_Kotlin_Kotlin Null Safety - Fatal编程技术网

'a?.let{}?:run{}'在Kotlin中是惯用语吗?

'a?.let{}?:run{}'在Kotlin中是惯用语吗?,kotlin,kotlin-null-safety,Kotlin,Kotlin Null Safety,我在S.O.的帖子中看到以下评论,我很感兴趣: 为什么不使用if进行空检查a?.let{}?:run{}仅在极少数情况下适用,否则它就不是惯用用法——沃丹5月15日16日7:29 为什么这种结构“仅适用于极少数情况”? Kotlin的首席工程师说 run允许您在elvis运算符的右侧使用多个语句 虽然我承认这并不是真的认可它是惯用的。这两篇文章似乎都来自备受尊敬的S.O.Kotlin撰稿人。 启发原始评论的帖子提到,如果a是可变的,则表达式的let部分很重要。在这种情况下,您需要a?.let{}

我在S.O.的帖子中看到以下评论,我很感兴趣:

为什么不使用if进行空检查
a?.let{}?:run{}
仅在极少数情况下适用,否则它就不是惯用用法——沃丹5月15日16日7:29

为什么这种结构“仅适用于极少数情况”?
Kotlin的首席工程师说

run允许您在elvis运算符的右侧使用多个语句

虽然我承认这并不是真的认可它是惯用的。这两篇文章似乎都来自备受尊敬的S.O.Kotlin撰稿人。
启发原始评论的帖子提到,如果
a
是可变的,则表达式的
let
部分很重要。在这种情况下,您需要
a?.let{}?:运行{}
而不是
if{}else{}

我发现我喜欢“让猫王跑”的结构。大多数情况下我应该避免吗?
谢谢你的洞察力

在这种情况下,您需要一个?.let{}?:运行{},而不是if{}else{}

不,您可以省略
run{statement}
的run部分,并使用
a?.let{}:statement

在大多数情况下我应该避免吗

你需要的时候应该用它。例如,当您希望在该场景中运行多个语句时。有人指出,这是一种罕见的情况。通常,您会在elvis运算符的右侧看到一条语句。

当然,当你不需要的时候不要使用它。保持代码简单。

foo?混为一谈是危险的。让{bar(It)}?:baz()
如果(foo!=null)bar(foo)else baz()

假设您有一个函数:
fun computeElements():List?=emptyList()

考虑以下代码:

val maxElement = computeElements()?.let { it.max() } ?: return
println("Max element was $maxElement")
与之相比:

val list: List<Int>? = computeElements()
val maxElement = if (list != null) list.max() else return
println("Max element was $maxElement")
val列表:列表?=计算元素()
val maxElement=if(list!=null)list.max()else返回
println(“最大元素为$maxElement”)
你可能认为这是两种等价形式。但是,如果同时运行这两个命令,您将看到前者不会将任何内容打印到标准输出

这是因为
it.max()
为空列表返回
null
(因为没有max元素),这会导致对Elvis表达式的右侧求值,因此函数
会提前返回


简而言之,
。除了此表单不可读之外(
if else
被普遍理解,而
let run
不被理解),还可能发生细微的错误。

run
基本上确保在空值检查失败后运行的语句超过一条语句时,elvis运算符可用(如果空检查后涉及几行代码,这很有用)谢谢,大家。很高兴听到它可以接受。当然,我并不是想暗示我想在一个简单的语句就可以的时候使用它。我真的希望能就“让Elvis运行”的时间进行一些辩论不过,要理解@voddan最初的意思并不惯用。请记住,这里有一个警告。如果let块返回的值为null,则elvis运算符后面的语句将运行,因此在这种情况下let和run都可以执行。@TimCastelijns我知道,这只是一个提示。人们可能会认为它的行为与I完全一样F.= No.No.S.MHSWTF:哦,是的,好点。我赞成你对VIIILITION的评论很好的警告,以及对MMHSWF的评论的很好的说明。我正在看你的例子,并且认为早期的回归是我想要的,无论如何,但是你的观点是很好的,你必须考虑你传递给的lambda的返回值。