2

好的,这不是关于 vals 和 defs 或函数和方法之间的根本区别的另一个问题。我看到编译时:

val Extractor = new AnyRef { def unapply(s :String) => Some(s) }
val x = "hello" match { case Extractor(s) => s }

更改val Extractordef Extractor破坏代码。为什么会这样?这有点令人失望,因为我希望完全透明,让我将实现从 vals(无论如何生成方法)更改为 defs,反之亦然。我想知道用一个而不是另一个可以做什么?

4

1 回答 1

4

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

Extractor必须是一个稳定的标识符。请参阅Scala 语言规范的第 8.1.8 节。(Adef不稳定;aval是。)

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

于 2013-06-25T00:45:05.597 回答