![](/img/trans.png)
[英]Why can't I pattern match on generics in Scala using TypeTags
[英]Why can't I pattern match on Stream.empty in Scala?
如果我取消注释指示的行,则下面的代码不会编译。 编译器抱怨:“需要稳定的标识符”。
val Empty = Stream.empty
val a = Stream.range(0, 5)
a match {
// case Stream.empty => println("nope") <-- does not work
case Empty => println("compiles") <-- works
case _ => println("ok")
}
如果我首先将Stream.empty
分配给值Empty
,它可以工作,但是如果没有这样的黑客,你就不能在这样的基本值上进行模式匹配。
我错过了什么吗?
你不能在Stream.empty
上进行模式匹配,因为它是一个总是返回空流的方法 (在对象Stream
)(但编译器不知道这一点)。
而不是分配val empty = Stream.empty
,您可以匹配Stream.Empty
,它是一个Object
:
scala> a match {
case Stream.Empty => println("done")
case h #:: tl => println(h)
}
您不能对不是常量的变量进行 “模式匹配”。
Stream.empty
不是“稳定”标识符,因为它代表了一些方法:
/** The empty stream */
override def empty[A]: Stream[A] = Empty
这可能会随时返回任何值。
编译器不知道其返回值始终为Empty
,因此它将其检测为潜在的更改变量 。
太深了,无法检测到它。
但是,当您将方法的retult分配给val
(因为不可变时是一个稳定的标识符)时,您的代码可以使用它来处理模式匹配。
您可能会读到这一点 ,引发一个假设,解释为什么模式匹配需要一个稳定的标识符。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.