Ich frage mich, wie ich mehrere Mustermuster verwenden kann. Ich habe:
abstract class MyAbstract
case class MyFirst extends MyAbstract
case class MySecond extends MyAbstract
case class MyThird extends MyAbstract // shouldn't be matched and shouldn't call doSomething()
val x: MyAbstract = MyFirst
x match {
case a: MyFirst => doSomething()
case b: MySecond => doSomething()
case _ => doSomethingElse()
}
Also möchte ich etwas schreiben wie:
x match {
case a @ (MyFirst | MySecond) => doSomething()
case _ => doSomethingElse()
}
Ich habe in einem Tutorial eine ähnliche Konstruktion gesehen, aber es gibt mir einen Fehler:
pattern type is incompatible with expected type;
[error] found : object MyFirst
[error] required: MyAbstract
Gibt es also eine Möglichkeit, in der case-Klausel einige verschiedene Typen zu definieren? Ich denke, das würde den Code schöner machen. Als ob ich 5 davon hätte, schreibe ich 5 Mal denselben Code (rufe doSomething () auf).
Danke im Voraus!
scala
types
pattern-matching
psisoyev
quelle
quelle
doSomething
Fälle, warum nicht diecase a : MyAbstract
dann ...?Antworten:
Ihnen fehlt die Klammer für Ihre Fallklassen. Fallklassen ohne Parameterlisten sind veraltet.
Versuche dies:
abstract class MyAbstract case class MyFirst() extends MyAbstract case class MySecond() extends MyAbstract val x: MyAbstract = MyFirst() x match { case aOrB @ (MyFirst() | MySecond()) => doSomething(aOrB) case _ => doSomethingElse() }
Wenn Sie zu viele Parameter für Ihre Fallklassen haben und keine langen
Foo(_,_,..)
Muster schreiben möchten , dann vielleicht:x match { case aOrB @ (_:MyFirst | _:MySecond) => doSomething(aOrB) case _ => doSomethingElse() }
Oder nur:
x match { case _:MyFirst | _:MySecond => doSomething(x) // just use x instead of aOrB case _ => doSomethingElse(x) }
Aber vielleicht wollten Sie nur Einzelfallobjekte?
abstract class MyAbstract case object MyFirst extends MyAbstract case object MySecond extends MyAbstract val x: MyAbstract = MyFirst x match { case aOrB @ (MyFirst | MySecond) => doSomething() case _ => doSomethingElse() }
quelle
obj @ (_: MyFirst | _: MySecond)
?obj
in Fällen, in denen ich es imdoSomething
Anruf benutze . In meinem Fall wurde der Anruf vondoSomething
nicht verwendetobj
, daher brauche ich ihn nicht. Trotzdem danke für deinen Kommentar!