Ответ 1
В ruby, создав AST, каждый символ представлен как уникальное целое число. Наличие символов в качестве хеш-клавиш делает вычисления намного быстрее, поскольку основная операция - это сравнение.
Когда я впервые начал читать и изучал рубин, я кое-что прочитал о силе символов ruby по строкам: символы хранятся в памяти только один раз, а строки хранятся в памяти один раз на строку, даже если они одинаковы.
Например: Rails 'params
Hash в контроллере содержит кучу ключей в качестве символов:
params[:id] or
params[:title]...
Но другие проекты с приличным размером, такие как Sinatra и Jekyll, не делают этого:
Джекил:
post.data["title"] or
post.data["tags"]...
Sinatra:
params["id"] or
params["title"]...
Это делает чтение нового кода немного сложным и затрудняет передачу кода и выясняет, почему использование символов не работает. Есть еще много примеров этого, и это немного запутывает. Должны ли мы или не должны использовать символы в этом случае? Каковы преимущества символов, и мы должны использовать их здесь?
В ruby, создав AST, каждый символ представлен как уникальное целое число. Наличие символов в качестве хеш-клавиш делает вычисления намного быстрее, поскольку основная операция - это сравнение.
Символы - это не мусор, собранный AFAIK, так что это может быть проблемой, за исключением того, что они действительно великолепны как хеш-ключи.
Одной из причин использования строк может быть использование yaml для определения значений.
require 'yaml'
data = YAML.load(<<-data
one:
title: one
tag: 1
two:
title: two
tag: 2
data
) #-> {"one"=>{"title"=>"one", "tag"=>1}, "two"=>{"title"=>"two", "tag"=>2}}
Вы можете использовать yaml для определения символьных клавиш:
require 'yaml'
data = YAML.load(<<-data
:one:
:title: one
:tag: 1
:two:
:title: two
:tag: 2
data
) #-> {:one=>{:title=>"one", :tag=>1}, :two=>{:title=>"two", :tag=>2}}
Но в символах yaml-определения немного странно, строки выглядят более естественными.
Другая причина для строк как ключей: в зависимости от варианта использования, разумно сортировать по ключам, но вы не можете сортировать символы (по крайней мере, не без преобразования в строки).
Основное отличие состоит в том, что несколько символов, представляющих одно значение, идентичны, тогда как это неверно для строк. Например:
irb(main):007:0> :test.object_id
=> 83618
irb(main):008:0> :test.object_id
=> 83618
irb(main):009:0> :test.object_id
=> 83618
3 ссылки на символ: test, все тот же объект.
irb(main):010:0> "test".object_id
=> -605770378
irb(main):011:0> "test".object_id
=> -605779298
irb(main):012:0> "test".object_id
=> -605784948
3 ссылки на строку "test", все разные объекты.
Это означает, что использование символов может потенциально сохранить хороший бит памяти в зависимости от приложения. Кроме того, быстрее сравнивать символы для равенства, так как они являются одним и тем же объектом, сравнение одинаковых строк происходит намного медленнее, поскольку значения строк нужно сравнивать, а не только идентификаторы объектов.
Я обычно использую строки почти для всех, кроме таких, как хеш-ключи, где мне действительно нужен уникальный идентификатор, а не строка