Scala模式匹配区分路径依赖类型取决于中定义的范围实例?
更新:在repl中运行的简化代码 我想使用路径依赖类型创建特定于域的事件,如创建、更新、删除等,这些类型扩展了一个公共标记特征,以便域可以(a)彼此发送事件和(b)按域进行模式匹配:Scala模式匹配区分路径依赖类型取决于中定义的范围实例?,scala,pattern-matching,path-dependent-type,Scala,Pattern Matching,Path Dependent Type,更新:在repl中运行的简化代码 我想使用路径依赖类型创建特定于域的事件,如创建、更新、删除等,这些类型扩展了一个公共标记特征,以便域可以(a)彼此发送事件和(b)按域进行模式匹配: trait Event trait Domain { case class Created(name: String) extends Event } // declare three instances of Domain trait, one here and two // in an inner s
trait Event
trait Domain {
case class Created(name: String) extends Event
}
// declare three instances of Domain trait, one here and two
// in an inner scope
object DomainC extends Domain
{
object DomainA extends Domain
object DomainB extends Domain
def lookingForAs(event: Event): Unit = {
println(s"${event.getClass}")
event match {
case DomainB.Created(_) => println("Oops matched a B")
case DomainC.Created(_) => println("Oops matched a C")
case DomainA.Created(_) => println("Found my A")
}
}
lookingForAs(DomainA.Created("I am an A"))
}
结果是“Oops匹配C”
lookingForAs
功能
- 与DomainA.Created到DomainB.Created的实例不匹配
- 与DomainA.Created的实例不正确地匹配到DomainC.Created
Scala 2.10.2、2.10.3、2.10.4和2.11.5的REPLs中的相同结果得到了Scala用户Google Group的回答:Jason Zaugg(化名)说这是一个Scala bug,并创建了跟踪它以针对2.12的修复。再次感谢Jason在其中定义了类
lookingForAs
?我在同一个文件中定义了一个对象中的所有类型,得到了“Oops matched a B”。上述内容被包装在一个单元测试类中,当然RemoteDomain除外,它位于同一包中的另一个文件中。我将尝试使用相同的文件/不同的封闭对象,看看这是否会产生不同的打印事件。在lookingForAs
中的getClass
只为我打印Domain$Created
,用于事件的任何来源。它是否在您的案例中打印不同的内容?在lookingForAs
中打印Domain$Created
以查找事件的任何来源,以及DomainA
/DomainB
声明是否在单元测试类内部或外部