'a?.let{}?:run{}'在Kotlin中是惯用语吗?
我在S.O.的帖子中看到以下评论,我很感兴趣: 为什么不使用if进行空检查'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{}
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的返回值。