この例を見つけたとき、私はパターンマッチングを学ぼうとしていました。ケースクラスのパターンマッチングは、オーバーロードされたケースクラスのコンストラクターでは機能していないようです。
case class MyClass(var first:String, var last:String){
def this(first: String) = this(first, "")
override def toString = "First: "+ first + " Last:" +last
}
val myClassTwo = new MyClass("a", "b")
myClassTwo match {
case MyClass(a,b) => println("two constructor matched")
case MyClass(a) => println("one constructor matched")
case _ => println("Not matched")
}
「caseMyClass(a)」行で「パターンMyClass(first:String、last:String)の引数の数が間違っています。」というコンパイルエラーが発生します。オーバーロードされたコンストラクターでパターンマッチングが機能することを期待していましたが、機能していません。誰かがこの振る舞いを説明してもらえますか?
また、1つのコンストラクターパラメーターで間違った結果が得られます。
val myClassOne = new MyClass("a")
myClassOne match {
case MyClass(a,b) => println("two constructor matched")
case _ => println("Not matched")
}
myClassOne
これにより、アグリメントが1つしかない場合でも、「2つのコンストラクターが一致」します。説明してください。