【问题标题】:Should `val` be used when defining class parameters in Scala?在Scala中定义类参数时是否应该使用`val`?
【发布时间】:2021-09-30 01:08:35
【问题描述】:

https://docs.scala-lang.org/tour/classes.html 的 Scala 文档中,以下示例显示了包含参数的最小类定义:

class Point(var x: Int, var y: Int) {
    ...
}

以下代码 sn-ps 对我来说都可以正常工作:

  • 片段 1:class Train(number: Int)
  • 片段 2:class Train(val number: Int)

在 sn-p 2 中使用val 有什么好处?据我了解,默认情况下 val 是隐式的。明确地说numberval 而不是var 是唯一的好处吗?谢谢。

【问题讨论】:

  • 在第二个 sn-p number 是类 Train 的公共成员 - 在第一个 sn-p number 只能在 Train 的主体中访问,因为它只是构造函数的一个参数。
  • 谢谢@LuisMiguelMejíaSuárez。请写下这个作为答案。
  • 来自文档链接:“带有 val 和 var 的主构造函数参数是公开的。”大约 6 行以下:“没有 val 或 var 的参数是私有值,仅在类中可见。”

标签: scala


【解决方案1】:

来自您链接的documentation

带有valvar 的主构造函数参数是公开的。

例如(如示例):

class Point(val x: Int, val y: Int)
val point = new Point(1, 2)
point.x = 3  // <-- does not compile (because vals are immutable)

在此定义中,您可以访问xy,因为它们是public vals

point.x // 1
point.y // 2

下一段解释:

没有valvar 的参数是私有值,只在类中可见。

例如(如示例):

class Point(x: Int, y: Int)
val point = new Point(1, 2)
point.x  // <-- does not compile

在这个定义中,xyprivate vals

因此,您的 sn-p 1 有一个名为 private valnumber 而你的 sn-p 2 有一个名为 public valnumber

(请注意)对此的一个小警告是case classes,其中构造函数的所有参数都是公共的,无论valvar 关键字如何。如果省略,变量/值将是公开的。

【讨论】:

    【解决方案2】:

    在片段 1 中,number 是一个构造参数,不是类的成员。它只能在构造函数内部使用(class 的主体)。

    在 Snippet 2 中,number 是该类的公共只读成员。任何具有该类实例的代码都可以使用它。

    据我了解,默认情况下val 是隐式的。

    class 参数不是这样,但case class 参数是这样,这可能会在学习 Scala 时造成混淆。

    【讨论】:

      【解决方案3】:

      我在Lightbend Scala Language - Professional找到了答案:

      我从 REPL 确认了这一点:

      scala> class Hello(message: String)
      class Hello
      
      scala> val hello = new Hello("Hello, world!")
      val hello: Hello = Hello@2a454afb
      
      scala> hello.message
                   ^
             error: value message is not a member of Hello
      
      scala> class Hello(val message: String)
      class Hello
      
      scala> val hello = new Hello("Hello, world!")
      val hello: Hello = Hello@639e35dc
      
      scala> hello.message
      val res7: String = Hello, world!
      

      【讨论】:

        猜你喜欢
        • 2012-10-24
        • 1970-01-01
        • 2020-10-22
        • 2013-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-02
        • 2013-01-19
        相关资源
        最近更新 更多