加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – Kotlin:围绕几个表达式(或语句)的卷曲括号

发布时间:2020-12-16 09:09:10 所属栏目:安全 来源:网络整理
导读:我认为这个问题与 Kotlin function declaration: equals sign before curly braces有些相关 在Scala中,每个语句都是一个表达式(可能带有Unit类型).如果我们用大括号括起多个表达式,那么最后的表达式是花括号部分的实际值.因此, // Scalaval a = { val b = 1
我认为这个问题与 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-ary函数对象.

因此,如果我们要打印值4,我们需要执行println(a()).

事实上,Kotlin中的表达式{}是一个函数() – > ().

我在Kotlin官方参考页面中找不到关于此的解释.如果没有参数列表或 – >,花括号会产生一个函数吗?

当我使用Scala时,我会编写许多代码,就像第一个代码一样.但是,在Kotlin中,它创建了一个函数对象,我们必须调用该函数,这可能是循环或递归中的开销.

>有没有关于这件事的文件:只是花括号制作一个功能对象?
>如果多次使用,可以解决第二个代码中的开销吗?

编辑

这是多次迭代的实际代码:

在Java中

while ((count = input.read(data,BYTE_BLOCK_SIZE)) != -1) {
    ....
}

在斯卡拉

while {
  count = input.read(data,BYTE_BLOCK_SIZE)
  count != -1
} {
  ....
}

在Kotlin

while ({
    count = input.read(data,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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读