В чем разница между строкой и символом в Ruby? - PullRequest
56 голосов
/ 01 ноября 2008

В чем разница между строкой и символом в Ruby и когда вы должны использовать один над другим?

Ответы [ 11 ]

73 голосов
/ 01 ноября 2008

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

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

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

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

10 голосов
/ 29 апреля 2014

В чем различия между символами и строками?

  1. Символы неизменны: их значение остается постоянным.
  2. Многократное использование одного и того же символа имеет один и тот же идентификатор объекта и является одним и тем же объектом по сравнению со строкой, которая всегда будет другим объектом с уникальным идентификатором объекта.
  3. Вы не можете вызывать любые методы String, такие как #split для символов.

Из Понимание различий между символами и строками в Ruby

Если вы китаец, вы также можете прочитать 理解 Ruby Symbol

5 голосов
/ 15 сентября 2016

Заявление

foo = "bar"

создает новый объект в памяти. Если мы повторим утверждение

foo = "bar"

Создаем еще один объект

, чтобы получить более четкое представление, попробуйте следующий код на консоли ruby ​​

foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"
foo = "bar"
puts "string #{foo} with object id = #{foo.object_id}"

вы получите вывод как

string bar with object id = 70358547221180
string bar with object id = 70358548927060

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

foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"
foo = :bar
puts "symbol #{foo} with object id = #{foo.object_id}"

показывает

symbol bar with object id = 7523228
symbol bar with object id = 7523228

, что означает, что есть только один объект для: bar

далее символы неизменны , и вы не можете вызывать любые методы String, например #upcase, #split для символов.

Сравнение символов выполняется быстрее, чем сравнение строк.

Символы можно рассматривать как постоянные / неизменные строки, которые образуют уникальный набор, который эффективно преобразуется в указатели памяти в куче. Это означает, что сравнение двух символов выполняется быстро, потому что вы просто сравниваете 2 целых числа (указатели памяти).

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

Использует

используйте Symbol, если вы уверены, что значение останется постоянным. Пример использования символов для ключей хеша, используйте строку, если вы хотите изменить значение или использовать строковый метод для него.

3 голосов
/ 01 ноября 2008

Дополнительное различие между String и Symbol состоит в том, что String имеет гораздо больше методов для манипулирования строками, в то время как Symbol является относительно худым объектом.

Ознакомьтесь с документацией для String класса и Symbol класса .

1 голос
/ 15 января 2019

Случай, когда символ может быть катастрофой. Допустим, у вас есть params.map(&:to_sym) в вашем контроллере рельсов. Теперь здесь, если вы по какой-то причине конвертируете предоставленные пользователем данные в символ, это может быть опасно. Если данные, предоставленные пользователем, слишком велики, и, как мы знаем, этот символ не является сборщиком мусора, вы можете закончить тем, что исчерпали память сервера, что может привести к удалению вашего сайта.

1 голос
/ 05 июля 2016

Существует два основных различия между String и Symbol в Ruby.

  1. Строка является изменяемой, а Символ не является

    • Поскольку строка является изменяемой, ее можно где-то изменить и привести к неверному результату.

    • Символ является неизменным.

  2. Строка - это объект, поэтому она требует выделения памяти

    ставит "abc" .object_id # 70322858612020

    ставит "abc" .object_id # 70322846847380

    ставит "abc" .object_id # 70322846815460

В другой руке Symbol будет вам тем же объектом:

puts :abc.object_id # 1147868

puts :abc.object_id # 1147868

puts :abc.object_id # 1147868

Таким образом, для использования и сравнения строки требуется больше времени, чем для символа.

Вы можете прочитать больше здесь , чтобы полностью понять:

1 голос
/ 21 июля 2013

Строки изменчивы, символы неизменны
Примечание: изменяемые объекты могут быть изменены после назначения, в то время как неизменяемые объекты могут только быть перезаписан http://www.robertsosinski.com/2009/01/11/the-difference-between-ruby-symbols-and-strings/

1 голос
/ 01 ноября 2008

Символ - это то, что вы используете для представления имен и строк. Вы можете использовать символ, когда вам может понадобиться использовать строку несколько раз, поскольку это намного проще и эффективнее.

И только что нашел это через Google, который может предложить более подробную информацию: Вот, пожалуйста,

0 голосов
/ 17 марта 2014
Символ

является неизменным, а строка изменяемой.

когда мы выполняем какую-либо операцию со строкой, она создает новый объект и занимает память. Поскольку мы выполняем все больше и больше операций над строкой, это означает, что мы потребляем все больше и больше памяти.

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

для получения дополнительной информации, вы можете нажмите здесь

0 голосов
/ 01 ноября 2008

В качестве контрапункта мой друг недавно написал пост под названием "Рубиновый Rant" , который дает еще один взгляд на символы Ruby.

...