【问题标题】:Use Class Variables As Constants In Scala在 Scala 中使用类变量作为常量
【发布时间】:2010-10-22 15:19:18
【问题描述】:

我正在努力学习 Scala——来自 C++ 背景。我在尝试 为我正在一起破解的任务跟踪应用程序编写一个小班 帮助我学习如何编写 Scala。

这似乎应该很简单,但由于某种原因它躲避我:

package com.catenacci.tts

class Task(val ID:Int, val Description:String) {
 val EmptyID = 0
 val EmptyDescription = "No Description"

 def this() = this(EmptyID,EmptyDescription)
 def this(ID:Int)={
   this(ID,EmptyDescription)
 }
 def this(Description:String)={
   this(EmptyID,Description)
 }
}

我正在尝试提供三个构造函数:任务(ID,描述), 任务(ID),任务(描述)。在后两种情况下,我想 如果其中一个值不是,则将这些值初始化为常量值 由调用方提供。我希望能够在外面检查这个 用于单元测试目的的类。所以我想放两个 公共 vals 将允许我从课外检查 确保我的状态是我所期望的。

但是,由于某种原因,此代码无法编译。我收到以下错误:

error: not found: value EmptyID

error: not found: value EmptyDescription

那么我错过了什么?我正在研究“Scala编程”所以 如果这个问题有一个简单的答案,请给我页面 数字。我不介意阅读,而是按照第 60 页的代码和 第 62 页,我不明白为什么这段代码会失败。

我猜这与以下事实有关 构造方法,并且可能两个 val 没有初始化 直到构造函数结束。如果是这样的话,有一些 如何获得我想要的效果?

【问题讨论】:

标签: syntax scala


【解决方案1】:

您可以在伴随对象中定义常量:

object Task { 
 val EmptyID = 0
 val EmptyDescription = "No Description"
}

然后将它们引用为 Task.EmptyID 和 Task.EmptyDescription。

我认为 Scala 2.8 支持默认值。

【讨论】:

    【解决方案2】:

    请参阅德语以获得答案。这是因为构造函数是技术上静态作用域的一部分。换句话说,构造函数无法访问任何实例成员,因为该实例尚未创建。任何“类成员”实际上都是实例成员,这就是问题中的代码不起作用的原因。 Germán 的回答通过将两个相关值移动到伴随对象中来解决这个问题,这实际上使它们成为 Task 类的静态成员(不是真的,但你可以这样想)。

    【讨论】:

    • 谢谢——很高兴知道为什么这不起作用以及知道如何解决它。
    • 是的。有一段时间我想知道为什么这在经典的“公共静态最终”的 Java 中不是问题 - 这是因为静态。
    【解决方案3】:

    在“Scala 编程”中,请参阅第 6.7 节,其中解释了构造函数调用的链接。主构造函数被描述为“类的单一入口点”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-19
      • 2014-07-04
      • 2016-03-25
      • 2011-04-21
      • 2012-01-02
      • 2012-02-04
      • 2010-09-18
      • 2014-05-14
      相关资源
      最近更新 更多