我正在努力学习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)
 }
}

我正在尝试提供三个构造函数:Task(ID,Description), 任务(ID),任务(描述)。在后两种情况下我想 如果其中一个值不是,则将值初始化为常量值 由来电者提供。而且我希望能够在外面检查这个 用于单元测试目的的类。所以我认为加入两个 公共警察允许我从班级外面检查 确保我的状态符合我的期望。

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

error: not found: value EmptyID

error: not found: value EmptyDescription

那我错过了什么?我正在研究“Scala编程”。所以 如果对这个问题有一个简单的答案,请给我一页 数字。我不介意阅读,但请参阅第60页的代码 第62页,我看不出为什么这段代码失败了。

我猜它与这些事实有关 构造函数方法,可能两个val都没有初始化 直到构造函数结束。如果是这样的话就有一些 如何获得我正在寻找的效果?

有帮助吗?

解决方案

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

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

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

我认为Scala 2.8支持默认值。

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top