ssc*_*zio 3 scala traits pattern-matching
我有一个超类Command,许多不同的子类的命令,并在同一时间延长也可以扩展这些性状的一种或多种ValuesCommand,KeysCommand,MembersCommand和其他许多人.
现在我想模式匹配Command扩展a ValuesCommand和KeysCommand同时的所有实现.
这是我想要实现的一些伪代码:
def apply(cmd : Command) = {
cmd match {
case c:(ValuesCommand && KeysCommand) => c.doSomething()
}
}
Run Code Online (Sandbox Code Playgroud)
我可以回退以匹配第一个特征并嵌套一秒match.但我真的不需要它,看起来很糟糕.
你可以这样做:
def apply(cmd : Command) = {
cmd match {
case c: ValuesCommand with KeysCommand => c.doSomething()
}
}
Run Code Online (Sandbox Code Playgroud)
当你有一个类(例如ValKey这里),它们都延伸ValuesCommand,KeysCommand你也有类似的东西
class ValKey extends ValuesCommand with KeysCommand`
Run Code Online (Sandbox Code Playgroud)
编辑(您的评论):
我无法想象你想要ValuesCommand or KeysCommand这种情况的场景.您可以阅读@Randall Schulz评论中的链接,了解如何获得OR.
让我们假设您有OR(v),如链接中所述.
case c: ValuesCommand v KeysCommand => //soo.. what is c?
Run Code Online (Sandbox Code Playgroud)
现在你仍然需要进行模式匹配,c以找出它是什么类型的命令.(最有可能的)
所以最后你仍然可以像这样直接做到:
cmd match {
case vc: ValuesCommand => vc.doSomething()
case kc: KeysCommand => kc.doSomehtingElse()
}
Run Code Online (Sandbox Code Playgroud)
EDIT2:
对于要在其上调用accept方法的场景cmd,仅当它是a ValuesCommand或者KeysCommand,您可以执行以下操作:
cmd match {
case _: ValuesCommand | _: KeysCommand => accept(cmd)
}
Run Code Online (Sandbox Code Playgroud)
我猜,这比干的更干
cmd match {
case vc: ValuesCommand => accept(cmd)
case kc: KeysCommand => accept(cmd)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2757 次 |
| 最近记录: |