scala - Kotlin:花括号围绕几个表达式(或语句)

标签 scala types expression kotlin

我认为这个问题与 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/

    相关文章:

    c - 为什么鼓励使用 "declared data types"而不鼓励使用 "processor-dependent data types"?

    java - 使用 getter 方法表达式访问数字属性

    haskell - 推断 lambda 表达式的类型

    scala - 如何在 Scala 中创建只读类成员?

    scala - 意外异常 : Compilation failed on new Play project

    java - Akka 中的 poststop 和 terminate 之间的区别?

    scala - Scala 中使用关联运算符的并行聚合

    c++ - 如何在 Allegro 的屏幕上从键盘输入?

    c - Windows:BOOL 有多大?

    sql - SQL 选择列表中的 bool 表达式