Scala符号的目的?

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]实习是一个过程,当您创建对象时,检查是否已存在相等的对象,如果存在,则使用该对象.这意味着如果你有两个相等的对象,它们就是同一个对象(即它们的引用相等).这样做的缺点是,查找需要使用哪个对象的成本很高,并且允许对象进行垃圾回收可能需要复杂的实现.


mic*_*ebe 8

Symbol被拘禁.

目的是SymbolStrings 更有效,并且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)

  • 这个条目有点误导; 你说"拥有相同的哈希码",所有相等的字符串都具有相同的哈希码.它们不同的地方在于它们恰好是同一个对象实例,这意味着比较它们并不涉及调用复杂的"等于"方法来比较每个字符; 你只需要比较内存位置(即Java中的==或Scala中的"eq").IttayD:那不是真的; 文本字符串是实例化的,您可以使用String.intern()实习字符串. (9认同)
  • 字符串不是 100% 总是实习 http://javatechniques.com/public/java/docs/basics/string-equality.html (2认同)

Itt*_*ayD 5

它在Scala中不是很有用,因此没有广泛使用.通常,您可以使用您想要指定标识符的符号.

例如,计划用于2.8.0的反射调用功能使用了语法obj o 'method(arg1, arg2),其中'o'是添加到Any的方法,并且添加了方法apply(Any*)(两者都带有'pimp my library').

另一个例子可能是,如果你想创建一种更简单的方法来创建HTML文档,那么不要使用"div"来指定你要写'div的元素.然后可以想象添加运算符到Symbol来创建用于创建元素的语法糖