В чем разница между строкой и символом в Ruby?
в чем разница между строкой и символом в Ruby и когда вы должны использовать один над другим?
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", все разные объекты.
это означает, что использование символов потенциально может сэкономить хороший бит памяти в зависимости от приложения. Также быстрее сравнивать символы для равенства, так как они являются одним и тем же объектом, сравнение одинаковых строк намного медленнее, так как строковые значения должны сравниваться, а не только идентификаторы объектов.
что касается того, когда использовать, я обычно использую строки почти для всего, кроме таких вещей, как хэш-ключи, где мне действительно нужен уникальный идентификатор, а не строка.
каковы различия между символами и строками?
- символы неизменны: их значение остается постоянным.
- многократное использование одного и того же символа имеет один и тот же идентификатор объекта и один и тот же объект по сравнению со строкой, которая будет другим объектом с уникальным идентификатором объекта, каждый раз.
- вы не можете вызвать ни один из строковых методов, таких как #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.
строка изменчива и символ не
поскольку строка изменчива, она может быть изменена где-то и может привести к неправильному результату.
символ неизменен.
строка-это объект, поэтому он нуждается в выделении памяти
ставит "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
таким образом, строка займет больше времени для использования и сравнения, чем символ.
вы можете подробнее здесь чтобы полностью понять: