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


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

10 55

10 ответов:

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

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

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

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

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

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

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

Если вы китаец, то вы можете также прочитать Symbol Ruby символ Рубина

дополнительная разница между String и Symbol это String имеет гораздо больше методов на нем для обработки строк, в то время как Symbol - Это относительно небольшой объект.

проверьте документацию для String класс и Symbol класс.

заявление

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

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

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

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

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

использует

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

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

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

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

символы и строки совершенно разные этот пост имеет небольшое представление о различиях. Как, когда и где их использовать, есть довольно обширный пост на эту тему на много :через.

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

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

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

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

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

есть два основных различия между строкой и символом в Ruby.

  1. строка изменчива и символ не

    • поскольку строка изменчива, она может быть изменена где-то и может привести к неправильному результату.

    • символ неизменен.

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

    ставит "abc".аргумент object_id # 70322858612020

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

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

С другой стороны, символ будет вам тот же объект:

puts :abc.object_id # 1147868

puts :abc.object_id # 1147868

puts :abc.object_id # 1147868

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

вы можете подробнее здесь чтобы полностью понять: