在Scala中使用类变量作为常量

时间:2009-04-29 16:32:18

标签: syntax scala

我正在努力学习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都没有初始化 直到构造函数结束。如果是这样的话就有一些 如何获得我正在寻找的效果?

3 个答案:

答案 0 :(得分:39)

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

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

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

我认为Scala 2.8支持默认值。

答案 1 :(得分:8)

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

答案 2 :(得分:1)

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