![](/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.