`a?.let{} ?: 运行{}` 在 Kotlin 中是惯用的吗?
Is `a?.let{} ?: run{}` idiomatic in Kotlin?
我在 S.O 中看到了以下评论。 post,我很感兴趣:
why don't you use if for null checks? a?.let{} ?: run{}
is only appropriate in rare cases, otherwise it is not idiomatic – voddan May 15 '16 at 7:29
为什么是那个结构 "only appropriate in rare cases"?
Kotlin 的首席工程师说,
run allows you to use multiple statements on the right side of an elvis operator
虽然我承认这实际上并不认可它是惯用的。这两个 post 似乎都来自非常受尊敬的 S.O。 Kotlin 贡献者。
启发原始评论的 post 提到如果 a
是可变的,则表达式的 let
部分很重要。在这种情况下,您需要 a?.let{} ?: run{}
而不是 if{} else {}
.
我发现我喜欢 "let Elvis run" 结构。在大多数情况下我应该避免它吗?
感谢您的任何见解。
In that case, you'll need a?.let{} ?: run{} instead of if{} else {}
不,您可以省略 run { statement }
的 运行 部分并使用 a?.let{} ?: statement
。
Should I avoid it in most cases?
需要的时候就用吧。例如。当您想在该场景中 运行 多个语句时。据指出,这是一种罕见的情况。通常,您会在 elvis 运算符的右侧看到一条语句。
当然,不要在不需要时使用它。保持代码简单。
将 foo?.let { bar(it) } ?: baz()
与 if (foo != null) bar(foo) else baz()
混为一谈是很危险的。
假设你有一个函数:fun computeElements(): List<Int>? = 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")
您可能认为这是两种等效形式。但是,如果你 运行 两者,你会发现前者不会将任何内容打印到标准输出!
这是因为it.max()
returns null
对于一个空列表(因为没有max元素),这导致Elvis表达式的右侧被计算,因此函数 return
早。
简而言之,?.let { ... } ?: ...
允许计算 "if-else" 的两个分支,这是危险的。除了这种形式不可读(if-else
被普遍理解,而 let-run
不是),可能会出现细微的错误。
我在 S.O 中看到了以下评论。 post,我很感兴趣:
why don't you use if for null checks?
a?.let{} ?: run{}
is only appropriate in rare cases, otherwise it is not idiomatic – voddan May 15 '16 at 7:29
为什么是那个结构 "only appropriate in rare cases"?
Kotlin 的首席工程师说,
run allows you to use multiple statements on the right side of an elvis operator
虽然我承认这实际上并不认可它是惯用的。这两个 post 似乎都来自非常受尊敬的 S.O。 Kotlin 贡献者。
启发原始评论的 post 提到如果 a
是可变的,则表达式的 let
部分很重要。在这种情况下,您需要 a?.let{} ?: run{}
而不是 if{} else {}
.
我发现我喜欢 "let Elvis run" 结构。在大多数情况下我应该避免它吗?
感谢您的任何见解。
In that case, you'll need a?.let{} ?: run{} instead of if{} else {}
不,您可以省略 run { statement }
的 运行 部分并使用 a?.let{} ?: statement
。
Should I avoid it in most cases?
需要的时候就用吧。例如。当您想在该场景中 运行 多个语句时。据指出,这是一种罕见的情况。通常,您会在 elvis 运算符的右侧看到一条语句。
当然,不要在不需要时使用它。保持代码简单。
将 foo?.let { bar(it) } ?: baz()
与 if (foo != null) bar(foo) else baz()
混为一谈是很危险的。
假设你有一个函数:fun computeElements(): List<Int>? = 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")
您可能认为这是两种等效形式。但是,如果你 运行 两者,你会发现前者不会将任何内容打印到标准输出!
这是因为it.max()
returns null
对于一个空列表(因为没有max元素),这导致Elvis表达式的右侧被计算,因此函数 return
早。
简而言之,?.let { ... } ?: ...
允许计算 "if-else" 的两个分支,这是危险的。除了这种形式不可读(if-else
被普遍理解,而 let-run
不是),可能会出现细微的错误。