soc*_*soc 61 syntax symbols scala language-design literals
可能重复:
Scala中符号文字的一些示例用例是什么?
Symbol的目的是什么?为什么它应该得到一些特殊的文字语法,例如'FooSymbol?
Cal*_*lum 93
符号用于您希望能够快速比较的一组封闭标识符.当你有两个String实例时,它们不能保证被实习[1],所以为了比较它们,你必须经常通过比较长度检查它们的内容,甚至检查它们是否相同.对于Symbol实例,比较是一个简单的eq检查(即==在Java中),因此它们是恒定的时间(即O(1))来查找.
这种结构倾向于在动态语言中使用得更多(特别是Ruby和Lisp代码往往会大量使用符号),因为在静态类型语言中,人们通常希望按类型限制项集.
话虽如此,如果你有一个键/值存储,其中有一组有限的键,使用静态类型对象将是不方便的,一个Map[Symbol, Data]样式的结构可能对你有好处.
String关于Java(以及Scala)实习的一个注释:String无论如何,Java 在某些情况下被实习; 特别是字符串文字会自动实现,您可以intern()在String实例上调用该方法以返回实习副本.String但是,并非所有s都被实现,这意味着运行时仍然必须进行全面检查,除非它们是同一个实例; interning使得比较两个相等的实习字符串更快,但不会改善比较不同字符串的运行时间.Symbol受益于保证被拘留,因此在这种情况下,单个参考相等检查足以证明平等或不平等.
[1]实习是一个过程,当您创建对象时,检查是否已存在相等的对象,如果存在,则使用该对象.这意味着如果你有两个相等的对象,它们就是同一个对象(即它们的引用相等).这样做的缺点是,查找需要使用哪个对象的成本很高,并且允许对象进行垃圾回收可能需要复杂的实现.
Symbol被拘禁.
目的是Symbol比Strings 更有效,并且Symbol具有相同名称的s被引用到同一个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)
Run Code Online (Sandbox Code Playgroud)
它在Scala中不是很有用,因此没有广泛使用.通常,您可以使用您想要指定标识符的符号.
例如,计划用于2.8.0的反射调用功能使用了语法obj o 'method(arg1, arg2),其中'o'是添加到Any的方法,并且添加了方法apply(Any*)(两者都带有'pimp my library').
另一个例子可能是,如果你想创建一种更简单的方法来创建HTML文档,那么不要使用"div"来指定你要写'div的元素.然后可以想象添加运算符到Symbol来创建用于创建元素的语法糖