因此,虽然ruby String
是全局唯一的,但红宝石Symbol
不是,因为它是由id存储在后台的某个地方:
http://thoughtsincomputation.com/posts/ruby-symbols-what-are-they
...这意味着使用符号会占用更少的内存,因为您可以使用符号的指定值集(例如,您不希望将每个用户输入的文本字符串转换为符号)。 / p>
我的问题是,虽然使用符号肯定有性能优势,但它最终是否值得?我问,因为,例如,我用符号写了大部分哈希:
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"}
但这只是为应用程序添加了另一层:
似乎有些不对劲......要么一切都应该是符号或字符串,不应该来回转换,至少在这种情况下是这样。
您如何看待这个?这个可以吗?这甚至是一个问题,还是红宝石垃圾收集器和所有这些(还没有去过那里)好吗?
答案 0 :(得分:13)
除非您认真对待服务器/系统的限制,否则任何一种方法的优点或缺点都可以忽略不计。
当使用绝对需要的库时,你给它一个字符串键入的哈希值,显然最好简单地使用字符串,因为它可以保持代码清晰简洁,并且不需要你把键转换为字符串。
Ruby旨在让开发人员更加愉快地编程,并且不会声称自己是最有效的。当我使用Ruby时,我会把它放在心上并使用符号作为哈希中的键,因为它使它们更容易阅读。
归根结底,这是个人偏好,你不会注意到速度的增加/减少。除非您遇到速度/内存约束问题,否则您无需担心。在这成为一个问题之前,Ruby标准库的其他部分将开始崩溃。
“过早优化是所有邪恶的根源” - Donald Knuth