簡體   English   中英

為什么我不能在Scala中的Stream.empty上進行模式匹配?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM