我正在努力学习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都没有初始化 直到构造函数结束。如果是这样的话就有一些 如何获得我正在寻找的效果?
答案 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节,其中解释了构造函数调用的链接。主构造函数被描述为“类的单个入口点”。