为什么可以';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
分配给valueempty
,它会工作,但奇怪的是,如果没有这样的技巧,就无法对这样一个基本值进行模式匹配
我遗漏了什么吗?您不能对非常量的变量进行“模式匹配”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)
}