我认为这个问题与 Kotlin function declaration: equals sign before curly braces 有点相关。
在 Scala 中,每个语句都是一个表达式(可能是 Unit
类型)。如果我们用大括号包围多个表达式,那么最终表达式就是花括号部分的实际值。所以,
// Scala
val a = {
val b = 1
val c = b + b
c + c
}
println(a)
a
的类型是 Int
并且代码打印值 4
.然而,在 Kotlin 中,这有些不同。
如果我们在 Kotlin 中做同样的事情,
// Kotlin
val a = {
val b = 1
val c = b + b
c + c
}
println(a)
a
的类型是 () -> Int
代码打印Function0<java.lang.Integer>
,表示结果类型为 Int
的 0 元函数对象.因此,如果我们要打印值
4
,我们需要做println(a())
.实际上,表达式
{}
在 Kotlin 中是一个函数 () -> ()
.我在 Kotlin 官方引用页面中找不到对此的解释。没有参数列表或
->
,花括号做一个函数?当我使用 Scala 时,我编写了很多代码,就像第一个代码一样。然而,在 Kotlin 中,它 创建 一个函数对象,我们必须 调用函数,这可能是循环或递归中的开销。
编辑
这是迭代多次的实际代码:
在 java
while ((count = input.read(data, 0, BYTE_BLOCK_SIZE)) != -1) {
....
}
在斯卡拉
while {
count = input.read(data, 0, BYTE_BLOCK_SIZE)
count != -1
} {
....
}
在 Kotlin
while ({
count = input.read(data, 0, BYTE_BLOCK_SIZE)
count != -1
}()) {
...
}
可以看到,只有 Kotlin 制作了很多函数对象并调用它们。
最佳答案
在 Kotlin {}
始终是 lambda 表达式或语法结构的一部分,如 while(true) {}
.可能与 Scala 不同,但很容易掌握。
你可能想要的是:
val a = run {
val b = 1
val c = b + b
c + c
}
println(a)
Kotlin 没有“任何地方的代码块”的内置概念。相反,我们使用标准函数助手,如
run
在上面的例子中。https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/run.html
关于scala - Kotlin:花括号围绕几个表达式(或语句),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38952278/