斯卡拉符号的目的?

可能重复:
Scala中符号文字的一些用例是什么?

Symbol的目的是什么?为什么它需要一些特殊的字面语法,比如'FooSymbol

符号用于您想要快速比较的一组封闭的标识符。 当你有两个String实例时,它们不能保证被实现[1],所以为了比较它们,你必须经常通过比较长度来检查它们的内容,甚至检查字符是否相同。 使用Symbol实例,比较是一个简单的eq检查(即Java中的== ),所以它们是恒定的时间(即O(1))来查找。

这种结构往往更多地用于dynamic语言(特别是Ruby和Lisp代码倾向于大量使用符号),因为在静态types语言中,人们通常希望按types限制项目集合。

话虽如此,如果您有一个键/值存储区,有一组有限的键,将使用一个静态types的对象是笨拙的,一个Map[Symbol, Data]风格的结构可能会很好您。

关于Java在Java(以及Scala)上实现 String的说明:无论如何,在某些情况下,Java String是实现的。 特别是string文字会自动被拦截,您可以调用String实例的intern()方法来返回一个被拦截的副本。 但并不是所有的String都被执行,这意味着运行时仍然必须进行完整的检查,除非它们是相同的实例; 实际上,比较两个相等string的速度会更快,但不会改善比较不同string的运行时间。 Symbol保证是被保护的,所以在这种情况下,单一的参考平等检查就足以certificate平等或不平等。

[1]实习是一个过程,当你创build一个对象的时候,你检查一个对等是否已经存在,如果有的话就使用它。 这意味着如果你有两个相同的对象,它们是完全相同的对象(即它们是相等的)。 这样做的缺点是,查找需要使用哪个对象并且允许对象被垃圾回收可能需要复杂的实现。

Symbol是被禁止的。

目的是SymbolString更有效率,同名的Symbol被引用到相同的Symbol对象(因此具有相同的哈希码)。

看看这个阅读关于Ruby符号: http : //glu.ttono.us/articles/2005/08/19/understanding-ruby-symbols

你只能得到一个Symbol的名字:

 scala> val aSymbol = 'thisIsASymbol aSymbol: Symbol = 'thisIsASymbol scala> assert("thisIsASymbol" == aSymbol.name) 

这在Scala中并不是很有用,因此没有被广泛使用。 一般来说,您可以在想要指定标识符的位置使用符号。

例如,计划用于2.8.0的reflection调用function使用语法obj o 'method(arg1, arg2) ,其中'o'是添加到Any的方法,Symbol添加了apply(Any *)方法'皮条客我的图书馆')。

另一个例子可能是,如果你想创build一个更简单的方式来创buildHTML文档,那么而不是使用“div”来指定一个元素,你会写'div。 然后可以想象,将运算符添加到符号来创build元素的语法糖