为什么可以';Scala中Stream.empty上的模式匹配是否为空?

为什么可以';Scala中Stream.empty上的模式匹配是否为空?,scala,pattern-matching,Scala,Pattern Matching,如果我取消注释所指示的行,下面的代码将无法编译。编译器抱怨:“需要稳定的标识符” val Empty=Stream.Empty val a=流量范围(0,5) 火柴{ //case Stream.empty=>println(“nope”)println(“编译”)println(“确定”) } 如果我首先将Stream.empty分配给valueempty,它会工作,但奇怪的是,如果没有这样的技巧,就无法对这样一个基本值进行模式匹配 我遗漏了什么吗?您不能对非常量的变量进行“模式匹配” St

如果我取消注释所指示的行,下面的代码将无法编译。编译器抱怨:“需要稳定的标识符”

val Empty=Stream.Empty
val a=流量范围(0,5)
火柴{
//case Stream.empty=>println(“nope”)println(“编译”)println(“确定”)
}
如果我首先将
Stream.empty
分配给value
empty
,它会工作,但奇怪的是,如果没有这样的技巧,就无法对这样一个基本值进行模式匹配

我遗漏了什么吗?

您不能对非常量的变量进行“模式匹配”
Stream.empty
不是一个“稳定”标识符,因为它表示某种方法:

/** The empty stream */
  override def empty[A]: Stream[A] = Empty
这可能会在任何时候返回任何值。
编译器不知道其返回值总是
空的
,因此它将其检测为一个潜在的变化变量
太深了,它无法探测到

但是,当您将方法的retult分配给
val
(由于不可变,因此是一个稳定的标识符)时,您的代码可以使用它处理到模式匹配


您可能会阅读,引发一个假设,解释为什么模式匹配需要一个稳定的标识符。

您不能在
流上进行模式匹配。empty
,因为它是一个方法(在对象
流中
),总是返回空流(但编译器不知道)

您可以在
Stream.empty
上进行匹配,而不是指定
val empty=Stream.empty
,该对象是
对象

scala> a match {
           case Stream.Empty => println("done")
           case h #:: tl => println(h)
       }

确认它至少适用于Scala 2.12。从2.13开始,情况可能会有所不同。
scala> a match {
           case Stream.Empty => println("done")
           case h #:: tl => println(h)
       }