gpt4 book ai didi

scala - Scala 中的 Nulls ...为什么会这样?

转载 作者:行者123 更新时间:2023-12-03 12:36:40 25 4
gpt4 key购买 nike

我在 Scala 中编码并在 Intellij 中进行了一些快速重构,当时我偶然发现了以下奇怪的东西......

package misc

/**
* Created by abimbola on 05/10/15.
*/
object WTF extends App {

val name: String = name
println(s"Value is: $name")
}

然后我注意到编译器没有提示,所以我决定尝试运行它,我得到了一个非常有趣的输出
Value is: null
Process finished with exit code 0

谁能告诉我为什么会这样?

编辑:
  • 第一个问题,值姓名 即使它还不存在,也被分配了对自身的引用;为什么正是 Scala 编译器不会因错误而爆炸???
  • 为什么赋值的值为空?
  • 最佳答案

    1.) 为什么编译器不爆炸

    这是一个简化的示例。这是编译的,因为通过给定的类型可以推断出默认值:

    class Example { val x: Int = x }

    scalac Example.scala
    Example.scala:1: warning: value x in class Example does nothing other than call itself recursively
    class Example { val x: Int = x }

    这不会编译,因为无法推断出默认值:
    class ExampleDoesNotCompile { def x = x }

    scalac ExampleDoesNotCompile.scala
    ExampleDoesNotCompile.scala:1: error: recursive method x needs result type
    class ExampleDoesNotCompile { def x = x }

    1.1 这里发生了什么

    我的解释。所以当心:统一访问原则开始生效。
    分配给 val x调用访问者 x()它返回 x 的未初始化值。
    所以 x 设置为默认值。
    class Example { val x: Int = x }
    ^
    [[syntax trees at end of cleanup]] // Example.scala
    package <empty> {
    class Example extends Object {
    private[this] val x: Int = _;
    <stable> <accessor> def x(): Int = Example.this.x;
    def <init>(): Example = {
    Example.super.<init>();
    Example.this.x = Example.this.x();
    ()
    }
    }
    } ^

    2.) 为什么值为空

    默认值由 Scala 编译到的环境决定。

    在您给出的示例中,您看起来像是在 JVM 上运行。这里 Object 的默认值为 null .

    因此,当您不提供值时,默认值将用作后备。

    默认值 JVM:
    byte  0
    short 0
    int 0
    long 0L
    float 0.0f
    double 0.0d
    char '\u0000'
    boolean false
    Object null // String are objects.

    此外,默认值是给定类型的有效值:
    这是 REPL 中的一个示例:
    scala> val x : Int = 0
    x: Int = 0

    scala> val x : Int = null
    <console>:10: error: an expression of type Null is ineligible for implicit conversion
    val x : Int = null
    ^
    scala> val x : String = null
    x: String = null

    关于scala - Scala 中的 Nulls ...为什么会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33042800/

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