ユーザーが名前パラメーターを提供しない場合に備えて、適切なデフォルトを提供しようとしています。Eclipse IDE の Scala ワークシートで次の操作を行うと、コンパイラ エラーが発生します。
case class Type(id: Int, name: String, description: String = "")
case class Definition(id: Int, types: List[Type], separator: String = ";", name: String = types.mkString(separator))
エラーは、List の mkString メソッド呼び出し内の識別子「separator」に示されている「not found: value separator」です。これはケース クラスであり、以前のパラメータは既に定義されているため、name のデフォルト値を定義する際に「セパレータ」を使用できないのはなぜですか。そして、「名前」のデフォルト値を定義する際に「タイプ」を使用することさえできないことがわかりました。
私はこれを回避しようとしましたが、name を var に変換しないと方法がわかりません。これは私がやりたいことではありません。これに関するガイダンスまたは理解をいただければ幸いです。
更新:わかりました、これを回避するために私が見つけた方法は、コンパニオンオブジェクトを使用してコンストラクターに転送することでした:
case class Type(id: Int, name: String, description: String = "")
object Definition {
def create(id: Int, types: List[Type], separator: String = ";", name: String = "") =
Definition(id, types, separator, if (name != "") name else types.map(_.name).mkString(separator))
}
case class Definition(id: Int, types: List[Type], separator: String = ";", name: String) {
require(!separator.isEmpty, "separator must not be empty")
require(!name.isEmpty, "name must not be empty")
}
これは確かに、私が最初にやろうとしたことと比較して、Java のようなボイラープレートです。これを行う他の/より良い方法はありますか?