![](/img/trans.png)
[英]Difference of using parentheses () and not when calling function in React
[英]What is the benefit in removing parentheses when using Kotlin lambda expressions?
考慮這里給出的這個例子: 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
。
根本沒有實際的好處,它只是一個約定。
關於您所說的“保持標准”。 你究竟從哪里得到“通常的方式”? 我知道沒有全球編程約定,只有特定於語言的約定,所以這種表示法在定義上是標准的。
約定很重要,因為它們使任何熟悉語法的人閱讀代碼的工作量大大減少。 約定還反映了語言的使用。 借助 Kotlin,他們通過大量使用 lambdas 和內聯函數來推廣一種非常實用的風格,因此“括號外的 lambdas”對於保持代碼的簡潔和明確是必要的。
同樣正如@Tenfour04 在評論中所說,您的示例確實沒有反映語法的預期用法。 通常你有多行,即使你沒有,模式也應該傳達更多的東西。 以measureTimeMillis
function 為例:
measureTimeMillis {
askQuestion()
comment()
answerQuestion()
}
通過將 lambda 放在括號外,可以立即看出 function 的作用,即使對於非技術讀者來說,這正是約定的用途。
大括號 lambda 的真正好處是,就像所有最好的語言特性一樣,它改變了你的思維方式。
您提供的示例同樣用括號編寫,我同意 IntelliJ 建議始終使用尾隨形式是不必要的......
但是當我寫這樣的東西時:
with(someObject) {
doSomething();
doSomethingElse();
}
看起來我正在使用該語言的一個很酷的新功能,盡管我實際上只是在調用 function。
結果是人們開始思考他們可以編寫向語言添加東西的函數,因為他們有點可以,這導致他們為使用他們的代碼的人創造新的做事方式。
類型安全的構建器模式就是一個很好的例子。 許多 Kotlin 語言功能協同工作,因此,即使它只是調用函數和傳遞 lambda,它也為使用它的開發人員提供了新的體驗。
他們獲得了一種全新的方法來實例化復雜對象,這種方法比舊方法更自然,並且不需要為此添加任何語言 - 所有小的構建塊功能都可以用於許多其他事情。
更接近你的例子。 假設您需要轉換一個數字數組並將所有正數平方。 比較什么更容易閱讀:
val result = arrayOf(1.0, 2.0, -3.0).map({ number ->
convert(number, {
if (it > 0) it * it else it
})
})
val result = arrayOf(1.0, 2.0, -3.0).map { number ->
convert(number) {
if (it > 0) it * it else it
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.