Почему в проектах больше не используются символы Ruby вместо строк?

Когда я впервые начал читать и изучал рубин, я кое-что прочитал о силе символов ruby ​​по строкам: символы хранятся в памяти только один раз, а строки хранятся в памяти один раз на строку, даже если они одинаковы.

Например: Rails 'params Hash в контроллере содержит кучу ключей в качестве символов:

params[:id] or
params[:title]...

Но другие проекты с приличным размером, такие как Sinatra и Jekyll, не делают этого:

Джекил:

post.data["title"] or
post.data["tags"]...

Sinatra:

params["id"] or
params["title"]...

Это делает чтение нового кода немного сложным и затрудняет передачу кода и выясняет, почему использование символов не работает. Есть еще много примеров этого, и это немного запутывает. Должны ли мы или не должны использовать символы в этом случае? Каковы преимущества символов, и мы должны использовать их здесь?

Ответ 1

В ruby, создав AST, каждый символ представлен как уникальное целое число. Наличие символов в качестве хеш-клавиш делает вычисления намного быстрее, поскольку основная операция - это сравнение.

Ответ 2

Символы - это не мусор, собранный AFAIK, так что это может быть проблемой, за исключением того, что они действительно великолепны как хеш-ключи.

Ответ 3

Одной из причин использования строк может быть использование 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-определения немного странно, строки выглядят более естественными.

Другая причина для строк как ключей: в зависимости от варианта использования, разумно сортировать по ключам, но вы не можете сортировать символы (по крайней мере, не без преобразования в строки).

Ответ 4

Основное отличие состоит в том, что несколько символов, представляющих одно значение, идентичны, тогда как это неверно для строк. Например:

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", все разные объекты.

Это означает, что использование символов может потенциально сохранить хороший бит памяти в зависимости от приложения. Кроме того, быстрее сравнивать символы для равенства, так как они являются одним и тем же объектом, сравнение одинаковых строк происходит намного медленнее, поскольку значения строк нужно сравнивать, а не только идентификаторы объектов.

Я обычно использую строки почти для всех, кроме таких, как хеш-ключи, где мне действительно нужен уникальный идентификатор, а не строка