22

我正在努力学习 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 直到构造函数结束时才被初始化。如果是这种情况,有什么方法可以达到我想要的效果吗?

4

3 回答 3

43

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

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

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

我认为 Scala 2.8 支持默认值。

于 2009-04-29T17:26:08.307 回答
8

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

于 2009-04-29T22:35:16.707 回答
1

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

于 2009-05-03T16:40:40.283 回答