Таким образом, в то время как рубин String
является глобально уникальным, рубин Symbol
не является таковым, поскольку он хранится в id где-то на заднем плане:
http://thoughtsincomputation.com/posts/ruby-symbols-what-are-they
... что означает, что при использовании символов используется меньше памяти, учитывая, что у вас есть определенный набор значений, которым может быть символ (например, вы не хотите превращать каждую строку введенного пользователем текста в символ).
У меня такой вопрос, хотя использование символов определенно выигрывает в производительности, стоит ли это в конце концов? Я спрашиваю, потому что, например, я пишу большинство своих хэшей, используя символы:
my_hash = {:_id => "123", :key => "value"}
Но в драйвере ruby-mongo все ключи возвращаются в виде строк:
mongo_hash = {"_id" => "123", "key" => "value"}
Так что, если бы я использовал и мой хэш, и монго-хэш одинаково, я бы сделал следующее:
mongo_hash = Model.collection.find_one(:key => "value")
#=> {"_id" => "123", "key" => "value"}
mongo_hash.symbolize_keys!
#=> {:_id => "123", :key => "value"}
Но это просто добавляет еще один слой к приложению:
- Создайте связку строк для ключей в памяти.
- Теперь создайте символ для каждой строки (уже в памяти после первого раза, когда это будет сделано).
- Теперь уничтожьте строки, которые мы только что создали.
Кажется, что-то там не так ... все должно быть символами или строками, не должно быть преобразования назад и вперед, по крайней мере, в этом случае.
Что вы думаете об этом? Это нормально? Это даже проблема, или рубиновый сборщик мусора и все такое (еще не было) нормально с этим?