【发布时间】:2021-04-06 16:14:41
【问题描述】:
考虑这里给出的这个例子:https://stackoverflow.com/a/53376287/11819720
fun onClick(action: () -> Unit) { ... }
view.onClick({ toast(it.toString())} )
view.onClick() {toast(it.toString()) }
view.onClick { toast(it.toString()) }
还有这段代码:
fun convert(x: Double, converter: (Double) -> Double): Double{
val result = converter(x)
println("$x is converted to $result")
return result
}
fun convertFive (converter: (Int) -> double): Double{
val result = converter(5)
println(" 5 is converted to $result")
return result
}
fun main (args: Array<String>){
convert(20.0) { it * 1.8 + 32 }
convertFive { it * 1.8 + 32 }
}
看来我们的努力是为了省去写几个括号的时间,以免让读者感到困惑。 如果保持标准不是更好吗?在第二个示例中使用函数的常用方法是:
convert(20, {it * 1.8 + 32})
convertFive({it * 1.8 = 32})
但 IntelliJ 会抱怨并建议将 lambda 移出括号。为什么?有实际的好处吗?好像写10 + 2 * 5 / 34 而不是10 + (2 * 5) / 34。
【问题讨论】:
-
我会说这更像是写
10 + (2 * 5)而不是10 + ((2 * 5))- 这只是一个约定(在此处引用但没有详细说明原因:kotlinlang.org/docs/lambdas.html#passing-trailing-lambdas)。一旦您熟悉了约定,它就会使代码(可以说)更具可读性,使函数链接更清晰,并且它反映了一些函数式语言的风格。但它是“标准的”,是语言规范的一部分! -
惯例是没有括号,所以这是最不可能让习惯 Kotlin 的读者感到困惑的语法。他们选择了在大多数情况下最干净的语法。在您的第一个代码块中,最后一个示例的阅读和解释噪音最小。您的示例是简单的单行代码,但通常情况下,lambda 中有几行代码。大多数人宁愿不必跟踪在所有代码中放置尾括号的位置。
-
附带说明,
10 + 2 * 5 / 34 - 3.4实际上与10 + (2 * 5) / (34 - 3.4)不同。我对其进行了编辑以澄清。