Почему больше проектов не используют символы Ruby вместо строк? - PullRequest
11 голосов
/ 10 марта 2010

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

Например: Rails 'params Хэш в контроллере имеет несколько ключей в виде символов:

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

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

Джекилл:

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

Синатра:

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

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

Ответы [ 4 ]

4 голосов
/ 10 марта 2010

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

4 голосов
/ 10 марта 2010

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

0 голосов
/ 15 июня 2017

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

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 ссылки на символ: тест, все тот же объект.

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

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

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

0 голосов
/ 25 сентября 2011

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

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

...