所以虽然是红宝石 String
是全球独一无二的,红宝石 Symbol
不是,因为它是由id存储在后台的某个地方:
http://thoughtsincomputation.com/posts/ruby-symbols-what-are-they
...这意味着使用符号会占用更少的内存,因为您可以使用符号指定的一组值(例如,您不希望将每个用户输入的文本字符串转换为符号)。
我的问题是,尽管使用符号肯定有性能优势,但它最终是否值得?我问,因为,例如,我使用符号编写了大部分哈希:
my_hash = {:_id => "123", :key => "value"}
但是在ruby-mongo-driver中,所有键都以字符串形式返回:
mongo_hash = {"_id" => "123", "key" => "value"}
所以,如果我以同样的方式同时使用我的哈希和mongo哈希,我必须这样做:
mongo_hash = Model.collection.find_one(:key => "value")
#=> {"_id" => "123", "key" => "value"}
mongo_hash.symbolize_keys!
#=> {:_id => "123", :key => "value"}
但这只是为应用程序添加了另一层:
- 为内存中的键创建一串字符串。
- 现在为每个字符串创建一个符号(在第一次完成后已经在内存中)。
- 现在销毁我们刚创建的字符串。
这似乎有些不对劲......要么一切都应该是符号或字符串,不应该来回转换,至少在这种情况下。
你怎么看待这件事?这个可以吗?这甚至是一个问题,还是红宝石垃圾收集器和所有(还没有去过那里)好吗?