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)
 }
}

Task(ID, Description)、Task(ID)、Task(Description) の 3 つのコンストラクタを提供しようとしています。後者の 2 つのケースでは、値の 1 つが呼び出し元によって提供されない場合、値を定数値に初期化したいと考えています。そして、単体テストの目的で、クラスの外でこれをチェックできるようにしたいと考えています。したがって、2 つの public val を配置することで、クラスの外部からチェックして、自分の状態が期待どおりであることを確認できると考えました。

ただし、何らかの理由でこのコードはコンパイルされません。次のエラーが表示されます。

error: not found: value EmptyID

error: not found: value EmptyDescription

それで、私は何が欠けていますか?私は「Scala でのプログラミング」に取り組んでいるので、この質問に対する簡単な答えがあれば、ページ番号を教えてください。読んでも構いませんが、60 ページと 62 ページのコードを見ると、このコードが失敗する理由がわかりません。

これらがコンストラクターメソッドであり、コンストラクターの最後まで2つの値が初期化されない可能性があるという事実と関係があると思います。その場合、私が探している効果を得る方法はありますか?

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を参照してください。これは、コンストラクターが技術的に静的スコープの一部であるためです。つまり、インスタンスがまだ作成されていないため、コンストラクターはインスタンス メンバーにアクセスできません。「クラス メンバー」は実際にはインスタンス メンバーであるため、問題のコードは機能しません。Germánの答えは、2つの関連する値をコンパニオンオブジェクトに移動することでこれを修正します。これにより、効果的にクラスの静的メンバーになりますTask(実際にはそうではありませんが、そのように考えることができます)。

于 2009-04-29T22:35:16.707 に答える
1

"Programming in Scala" のセクション 6.7 を参照してください。ここでは、コンストラクター呼び出しの連鎖について説明しています。プライマリ コンストラクターは、「クラスの単一のエントリ ポイント」として記述されます。

于 2009-05-03T16:40:40.283 に答える