質問
私は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)
}
}
次の3つのコンストラクターを提供しようとしています:Task(ID、Description)、 タスク(ID)、タスク(説明)。後者の2つのケースでは、 値の1つがそうでない場合、値を定数値に初期化します 呼び出し元によって提供されます。これを外で確認できるようにしたい ユニットテスト目的のクラスの。だから私は2つ入れて考えた public valsを使用すると、クラスの外部からチェックして、 自分の状態が期待どおりであることを確認してください。
ただし、何らかの理由でこのコードはコンパイルされません。次のエラーが表示されます:
error: not found: value EmptyID
and
error: not found: value EmptyDescription
では、何が欠けていますか? 「Scalaでのプログラミング」で作業しています。そう この質問に簡単な答えがある場合は、私にページを教えてください 数字。読んでも構わないが、60ページのコードを見て 62ページ、このコードが失敗する理由がわかりません。
私はそれがこれらの事実と関係があると推測しています コンストラクターメソッドと、おそらく2つのvalが初期化されない コンストラクターの最後まで。その場合はいくつかあります 私が探している効果を得る方法?
解決
コンパニオンオブジェクトで定数を定義できます:
object Task {
val EmptyID = 0
val EmptyDescription = "No Description"
}
そして、それらをTask.EmptyIDおよびTask.EmptyDescriptionとして参照します。
Scala 2.8はデフォルト値をサポートしていると思います。
他のヒント
答えについてはGermá nをご覧ください。これは、コンストラクターが静的スコープの一部である技術的にためです。つまり、インスタンスはまだ作成されていないため、コンストラクターはインスタンスメンバーにアクセスできません。 「クラスメンバー」実際にはインスタンスメンバーであるため、問題のコードは機能しません。 Germá nの答えは、2つの関連する値をコンパニオンオブジェクトに移動することでこれを修正し、事実上それらを Task
クラスの静的メンバーにします(実際にはそうではありませんが、そのように考えることができます)。
「Scalaでのプログラミング」では、6.7節を参照してください。コンストラクター呼び出しのチェーンについては、6.7節を参照してください。プライマリコンストラクターは、「クラスのエントリの単一ポイント」として記述されます。