我理解字符串和符号之间的理论差异。 据我所知,符号旨在代表一个概念或一个名称或标识或标签或键,字符串是字符的包。 据我所知,字符串是可变的,短暂的,其中的符号是不可变的和永久的。 我甚至喜欢的符号如何在我的文字编辑器中查看不同的字符串。
让我困扰的是,实际上来说,符号是如此的相似字符串的事实,他们不是作为字符串实现会导致很多麻烦。 他们甚至不支持鸭打字或暗示的胁迫,不像其他著名的“相同,但不同的”夫妇,浮球Fixnum对象。
最大的问题,当然,是哈希进入红宝石从其他地方一样,JSON和HTTP CGI,使用字符串键,而不是符号键,因此Ruby程序必须使出浑身解数要么将这些前面或在查找时间。 仅仅存在HashWithIndifferentAccess
,并在Rails和其他框架及其猖獗的使用,证明了这里有一个问题,需要被划伤痒。
谁能告诉我一个实际原因的符号不应该被冻结的字符串? 除了“因为这是它是如何始终秉行”(历史的)或者“因为符号不是字符串”(乞讨的问题)。
考虑以下惊人的行为:
:apple == "apple" #=> false, should be true
:apple.hash == "apple".hash #=> false, should be true
{apples: 10}["apples"] #=> nil, should be 10
{"apples" => 10}[:apples] #=> nil, should be 10
:apple.object_id == "apple".object_id #=> false, but that's actually fine
所有它会采取让下一代Ruby开发者少困惑的是这样的:
class Symbol < String
def initialize *args
super
self.freeze
end
(和许多其他库级黑客的了,不过,不要太复杂)
也可以看看:
- http://onestepback.org/index.cgi/Tech/Ruby/SymbolsAreNotImmutableStrings.red
- http://www.randomhacks.net/articles/2007/01/20/13-ways-of-looking-at-a-ruby-symbol
- 为什么使用哈希符号的时候,而不是一个散列字符串做我的代码休息?
- 为什么要使用的符号,Ruby的哈希键?
- 什么是符号和我们如何使用它?
- 红宝石VS符号中的字符串哈希
- 无法获取符号在Ruby中的窍门
- http://blog.arkency.com/could-we-drop-symbols-from-ruby/
- 确实存在红宝石的符号,因为字符串是可变的,而不是拘留?
更新:我觉得马茨使得为案例class Symbol < String
很好的位置: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/9192 (感谢唑并挖这件事,也麦茨”最终收回)。