Nae*_*mul 3 types expression scala kotlin
我认为这个问题与Kotlin函数声明有些相关:在花括号之前等于符号
在Scala中,每个语句都是一个表达式(可能带有Unit类型).如果我们用大括号括起多个表达式,那么最后的表达式是花括号部分的实际值.因此,
// Scala
val a = {
val b = 1
val c = b + b
c + c
}
println(a)
Run Code Online (Sandbox Code Playgroud)
ais 的类型Int和代码打印值4.
然而,在Kotlin,这有些不同.如果我们在Kotlin做同样的事情,
// Kotlin
val a = {
val b = 1
val c = b + b
c + c
}
println(a)
Run Code Online (Sandbox Code Playgroud)
ais 的类型() -> Int和代码打印Function0<java.lang.Integer>,这意味着具有结果类型的0-ary函数对象Int.
因此,如果我们想要打印价值4,我们需要这样做println(a()).
事实上,{}Kotlin中的表达是一种功能() -> ().
我在Kotlin官方参考页面中找不到关于此的解释.没有参数列表或->花括号制作函数?
当我使用Scala时,我会编写许多代码,就像第一个代码一样.但是,在Kotlin中,它创建了一个函数对象,我们必须调用该函数,这可能是循环或递归中的开销.
有没有关于这件事的文件:只是花括号制作一个功能对象?
如果多次使用第二个代码中的开销,有什么办法解决?
编辑
这是多次迭代的实际代码:
在Java中
while ((count = input.read(data, 0, BYTE_BLOCK_SIZE)) != -1) {
....
}
Run Code Online (Sandbox Code Playgroud)
在斯卡拉
while {
count = input.read(data, 0, BYTE_BLOCK_SIZE)
count != -1
} {
....
}
Run Code Online (Sandbox Code Playgroud)
在Kotlin
while ({
count = input.read(data, 0, BYTE_BLOCK_SIZE)
count != -1
}()) {
...
}
Run Code Online (Sandbox Code Playgroud)
你可以看到,只有Kotlin生成很多函数对象并调用它们.
vod*_*dan 13
在Kotlin {}中,始终是lambda表达式或语法结构的一部分while(true) {}.可能与Scala不同,但很容易掌握.
你可能想要的是:
val a = run {
val b = 1
val c = b + b
c + c
}
println(a)
Run Code Online (Sandbox Code Playgroud)
Kotlin没有"任何地方的代码块"的内置概念.相反,我们使用标准函数 - 助手run,如上例所示.
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/run.html
如果{}定义了一个函数,你只需在声明它时调用它,它会立即对它进行求值:
val a = {
val b = 1
val c = b + b
c + c
}()
println(a)
Run Code Online (Sandbox Code Playgroud)
打印4.(注意()块的末尾)
| 归档时间: |
|
| 查看次数: |
1666 次 |
| 最近记录: |