我希望我的handle方法能够采用任何Animal类型,然后能够实际拥有特定类型,以便我可以继续处理。
我刚刚勾勒出我要找的东西:
dyld: Symbol not found: ...
如何设计我的域名,以便像上面那样工作?
答案 0 :(得分:2)
你几乎按原样运作的代码。
模式匹配的语法需要包含一个变量名,如果你实际上使用了case类的属性,你可能会使用这个模式来提取它们。
sealed trait Animal
case class Dog(id: Int) extends Animal
case class Cat(id: Int) extends Animal
case class Owl(id: Int) extends Animal
def processDog(dog: Dog) = println(s"woof ${dog.id}")
def processCat(id: Int) = println(s"meow $id")
def processOwl(owl: Owl, id: Int) = println(s"hoot ${owl.id}")
object AnimalHandler {
def handle(animal: Animal) = {
case dog: Dog => processDog(dog)
case Cat(id) => processCat(id)
case owl @ Owl(id) => processOwl(owl, id)
}
}
一些注意事项:
给定一个密封的特性,如果您的模式匹配不完整,编译器会发出警告(在您的情况下,您缺少对Owl的处理)。
如果方法/函数的主体只是参数上的模式匹配,则可以跳过animal match