我可以用scala.Singleton做什么?

Zav*_*ior 8 scala

澄清:我不是在问我可以使用Singleton设计模式.问题是scala中提供的很大程度上没有文档的特征.

这个特点是什么?到目前为止,我能找到的唯一具体用例是将特征限制为仅对象,如本问题所示:限制对象的特征?

这个问题揭示了scala.Singleton纯编译器小说的问题,但显然还有另一个用例!

有一些我无法想到的显而易见的用途,还是仅仅是主要的编译器?

0__*_*0__ 1

我认为 Martin Odersky 对链接问题链接的邮件列表线程的评论回答了这个问题:

\n\n
\n

Singleton 类型本质上是一种存在值的编码技巧。IE

\n\n
T forSome { val x: T }\n
Run Code Online (Sandbox Code Playgroud)\n\n

变成

\n\n
[x.type := X] T forSome { type X <: T with Singleton }\n
Run Code Online (Sandbox Code Playgroud)\n\n

单例类型通常不直接使用\xe2\x80\xa6

\n
\n\n

换句话说,除了指导编译器的打字阶段之外,没有任何预期用途。Scala 语言规范在 \xc2\xa73.2.10 和\xc2\xa73.2.1中有此位表示编译器可能会使用此特征来声明类型是稳定的。

\n\n
\n\n

您还可以通过以下内容看到这一点(Scala 2.11):

\n\n
(new {}).isInstanceOf[Singleton]\n\n<console>:54: warning: fruitless type test: a value of type AnyRef cannot also\n                       be a Singleton\n              (new {}).isInstanceOf[Singleton]\n                                   ^\nres27: Boolean = true\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以你甚至不能在有意义的测试中使用这个特性。

\n\n

这不是一个明确的答案,只是我的观察

\n

  • 在处理路径相关类型时,它实际上很有用——[这里有一个例子](https://gist.github.com/travisbrown/2bcee3650447094059e2)我上周就遇到了。 (2认同)