I have a super class Command, many different subclasses extend from Command and at the same time may also extend one or more of these traits ValuesCommand, KeysCommand, MembersCommand and many others.
Now I want to pattern match all implementations of Command that extend a ValuesCommand and KeysCommand at the same time.
Here is some pseudocode of what I want to achieve:
def apply(cmd : Command) = {
cmd match {
case c:(ValuesCommand && KeysCommand) => c.doSomething()
}
}
I could fallback to match the first trait and nest a second match. But I don't really need it and looks terrible.
You can do it like this:
def apply(cmd : Command) = {
cmd match {
case c: ValuesCommand with KeysCommand => c.doSomething()
}
}
When you have a class (e.g ValKey here) that both extends ValuesCommand and KeysCommand you also have something like
class ValKey extends ValuesCommand with KeysCommand`
Edit (Your comment):
I can't imagine a scenario where you want something like ValuesCommand or KeysCommand in this case. You can read the link in @Randall Schulz comment to see how to get an OR.
Let's imagine you have your OR (v), like described in the link.
case c: ValuesCommand v KeysCommand => //soo.. what is c?
Now you still have to pattern-match on c to find out what kind of command it is. (most likely)
So in the end you can still do it directly like this:
cmd match {
case vc: ValuesCommand => vc.doSomething()
case kc: KeysCommand => kc.doSomehtingElse()
}
Edit2:
For a scenario where you want to call your accept method on cmd, only if it is a ValuesCommand or KeysCommand, you can do:
cmd match {
case _: ValuesCommand | _: KeysCommand => accept(cmd)
}
which, i guess, is more DRY than
cmd match {
case vc: ValuesCommand => accept(cmd)
case kc: KeysCommand => accept(cmd)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With