好的,这不是另一个关于vals& amp;和defs或功能和方法。我看到,虽然这编译:
val Extractor = new AnyRef { def unapply(s :String) => Some(s) }
val x = "hello" match { case Extractor(s) => s }
将val Extractor
更改为def Extractor
会破坏代码。为什么会这样?这有点令人失望,因为我希望完全的trasnparency可以让我将vals(无论如何生成方法)的实现更改为defs,反之亦然。我想知道还有什么可以用一个而不是另一个做?
答案 0 :(得分:4)
我不确定我能提供详尽的清单,但我可以解释一下这种情况下发生了什么。
Extractor
必须是稳定的标识符。参见Scala Language Specification的8.1.8节。 (def
不稳定; val
是。)
稳定标识符具有某些不错的属性,可以更简单地计算它们并具有更大的优化可能性。