gpt4 book ai didi

scala - 对这个带有 & 不带 = 的代码片段返回类型感到非常困惑

转载 作者:行者123 更新时间:2023-12-04 21:52:41 32 4
gpt4 key购买 nike

object A extends App {

def closure1(x:Int) = {
object O {
def getX = x
def add(y:Int) = x+y
}
val foo = O
foo
}

def closure2(x:Int) {
object O {
def getX = x
def add(y:Int) = x+y
}
val foo = O
foo
}

println(closure1(4).getClass)
println(closure2(4).getClass)
}

result:
$scala A
class A$O$3$
void
  • 为什么返回类型不同?
  • 我真的不在乎返回类型。我想调用 getX 并添加 - 我想做像closure1(4).getX 这样的事情 - 这是非法的。我怎么做 ?
  • 最佳答案

    Scala 有一个不返回任何有趣值的代码的简写符号:省略 =符号。在 Java 中,这将返回 void ,即什么都没有;但在 Scala 中它实际上是 () ,类型的唯一成员 Unit .无论哪种方式,它都是一样的:什么都没有或没有意义的占位符。

    您想要一个无意义的占位符的原因是,当您编写通用代码时,您宁愿不必处理某些情况与没有什么不同的情况。

    反正:

    def f(): Unit = println("Hi")

    是一个仅显式返回无内容 () 的函数值(这也是 println 返回的值)。速记是
    def f() { println("Hi") }

    现在有一个偷偷摸摸的补充,那就是在 Scala 中,与许多 C 派生语言一样,您可以从所做的任何事情中丢弃返回值。当你扔掉它时,剩下的就是 () . Scala 将在 closure2 上向您发出警告你正在做一些可疑的事情:
    <console>:16: warning: a pure expression does nothing in statement position
    you may be omitting necessary parentheses
    foo
    ^
    defined module A

    但仍然会让你这样做(因为历史上预计这会起作用)。

    所以,总结一下:
    def f {}

    是一种仅返回无内容占位符 () 的方法.如果您将其完整地写出来,则语法将是
    def f: Unit = {}

    当您尝试返回错误类型的值时,它不会提示它会丢弃该值并为您提供类型 Unit ,但通常会发出警告:
    def f: Unit = 5
    def f { 5 }

    (请注意,这些天大多数人反对简写形式(这些天是 2.10-is-stable),很大程度上是因为在没有明确解释差异的情况下,新用户经常忽略 = 而没有意识到想知道为什么事情不起作用。所以在 future (2.11 或 2.12 表示弃用?) def f {} 形式可能不起作用。)

    如果你真的想要一个返回值——例如,你想要返回你的对象 O (顺便说一句,您可以直接将其分配给 foo ),确保包含 = :
    def f = { object O { def g = 5 }; O }

    scala> f.g
    res0: Int = 5

    (提示:编译器会提示你在这里使用结构类型。你最好使用 trait HasG { def g: Int } 然后 object O extends HasG ;否则 Scala 实际上使用反射来调用 f.g 出于我的一些基本原理从来没有完全能够跟随。)

    关于scala - 对这个带有 & 不带 = 的代码片段返回类型感到非常困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18368346/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com