val和无参数def之间的细微差别

时间:2013-06-25 00:05:54

标签: scala function

好的,这不是另一个关于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,反之亦然。我想知道还有什么可以用一个而不是另一个做?

1 个答案:

答案 0 :(得分:4)

我不确定我能提供详尽的清单,但我可以解释一下这种情况下发生了什么。

Extractor必须是稳定的标识符。参见Scala Language Specification的8.1.8节。 (def不稳定; val是。)

稳定标识符具有某些不错的属性,可以更简单地计算它们并具有更大的优化可能性。