【发布时间】:2013-09-07 14:57:19
【问题描述】:
scala.Symbol 的一个问题似乎是它有两个对象,Symbol 和它所基于的 String。
为什么不能通过定义 Sym 来消除这个额外的对象:
class Sym private(val name:String) extends AnyVal {
override def toString = "'" + name
}
object Sym {
def apply(name:String) = new Sym(name.intern)
}
诚然,对象分配对性能的影响可能很小,但对 Scala 有更深入了解的 cmets 会很有启发性。特别是,上面是否通过引用相等提供了有效的映射?
上面简单的“Sym”的另一个优点是在以地图为中心的应用程序中,其中有很多字符串键,但是在字符串命名许多完全不同类型的事物的情况下,可以定义类型安全的 Sym 类,以便 Maps 将明确地向程序员、编译器和重构工具展示真正的关键是什么。
(Symbol 和 Sym 都不能扩展,前者显然是可以选择的,后者是因为它扩展了 AnyVal,但 Sym 很简单,只需用适当的名称进行复制)
【问题讨论】:
-
关于能够拥有可以扩展的符号类型的有用性的任何答案?作为一个具体的例子,在遗传学中有遗传标记和个体,两者都通过一个简单的字符串名称来识别。同一个标记或个人可能会多次从数据文件中读取,因此符号的经济性是有意义的。但是采用符号的方法或 Map 可能肯定需要 MarkerSymbol 或 IndividualSymbol。 scala.Symbol 很容易修改以允许子分类。我能看到它没有的唯一原因是 'XYZ 糖。
标签: scala