Какая разница между строкой и символом в Ruby и когда мне следует использовать один над другим?
Какая разница между строкой и символом в Ruby?
Ответ 1
Основное различие заключается в том, что несколько символов, представляющих одно значение, идентичны, тогда как в случае строк это не так. Например:
irb(main):007:0> :test.object_id
=> 83618
irb(main):008:0> :test.object_id
=> 83618
irb(main):009:0> :test.object_id
=> 83618
Это три ссылки на символ :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
Это три ссылки на строку "test", но все они разные объекты.
Это означает, что использование символов может потенциально сэкономить много памяти в зависимости от приложения. Также быстрее сравнивать символы на равенство, поскольку они являются одним и тем же объектом, сравнение идентичных строк выполняется намного медленнее, поскольку необходимо сравнивать значения строк, а не только идентификаторы объектов.
Что касается того, когда использовать который, я обычно использую строки почти для всего, кроме таких вещей, как хеш-ключи, где мне действительно нужен уникальный идентификатор, а не строка.
Ответ 2
Каковы различия между символами и строками?
- Символы неизменны: их значение остается постоянным.
- Многократное использование одного и того же символа имеет один и тот же идентификатор объекта и является одним и тем же объектом по сравнению со строкой, которая каждый раз будет другим объектом с уникальным идентификатором объекта.
- Вы не можете вызвать любой из методов String, таких как
split
для символов.
Из понимания различий между символами и строками в Ruby
Если вы китаец, вы также можете прочитать 理解 Ruby Symbol.
Ответ 3
Заявление:
foo = "bar"
создает новый объект в памяти. Если мы повторим утверждение:
foo = "bar"
Мы создаем еще один объект.
Чтобы понять это, попробуйте этот код в IRB:
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
для символов.
Сравнение символов быстрее, чем сравнение строк. Символы могут рассматриваться как постоянные/неизменные строки, которые образуют уникальный набор, который эффективно преобразуется в указатели памяти в куче. Это означает, что сравнивать два символа очень быстро, потому что вы просто сравниваете два целых числа (указатели памяти).
Строки являются изменяемыми, поэтому указатель памяти на их значение в куче может измениться после модификации. Это означает, что операции сравнения медленнее, потому что могут существовать дубликаты, которые семантически эквивалентны.
Используйте символ, если вы уверены, что значение останется постоянным, например, используйте символы для хеш-ключей. Используйте строку, когда вы хотите изменить значение или использовать строковый метод для него.
Ответ 4
Дополнительная разница между String
и Symbol
заключается в том, что String
имеет множество методов для управления строкой, а Symbol
- относительно скудный объект.
Ознакомьтесь с документацией для String
class и Symbol
класс.
Ответ 5
Есть два основных различия между String и Symbol в Ruby.
-
Строка является изменяемой, а Symbol не является:
- Поскольку строка является изменяемой, она может быть изменена где-то и может привести к неверному результату.
- Символ неизменен.
-
String - это объект, поэтому он требует выделения памяти
puts "abc".object_id # 70322858612020 puts "abc".object_id # 70322846847380 puts "abc".object_id # 70322846815460
С другой стороны, Symbol вернет тот же объект:
puts :abc.object_id # 1147868 puts :abc.object_id # 1147868 puts :abc.object_id # 1147868
Таким образом, для использования и сравнения String потребуется больше времени, чем для Symbol.
Прочитайте раздел " Разница между символами Ruby и строками " для получения дополнительной информации.
Ответ 6
Случай, когда символ может быть катастрофой. params.map(&:to_sym)
вас есть params.map(&:to_sym)
в вашем контроллере rails. Теперь здесь, если вы по какой-то причине конвертируете предоставленные пользователем данные в символ, это может быть опасно. Если данные, предоставленные пользователем, слишком велики, и, как мы знаем, этот символ не является сборщиком мусора, вы можете закончить тем, что исчерпали память сервера, что может привести к удалению вашего сайта.
Ответ 7
Символ - это то, что вы используете для представления имен и строк. Вы хотели бы использовать символ, если вам может понадобиться использовать строку несколько раз, так как это намного проще и продуктивнее.
И только что нашел это через google, который может предложить более подробную информацию: Здесь вы идете
Ответ 8
Символы и строки совершенно разные этот пост имеет небольшое представление о различиях. Что касается того, когда и где их использовать, есть довольно обширная публикация по этому вопросу на имеет много: через.
Ответ 9
В качестве контрапункта мой друг недавно написал статью под названием "Ruby Rant" , которая еще раз взглянет на символы Ruby.
Ответ 10
Строки являются Mutable, символы arre неизменяемы
Примечание. Объекты Mutable могут быть изменены после назначения, тогда как неизменяемые объекты могут
быть перезаписанным
http://www.robertsosinski.com/2009/01/11/the-difference-between-ruby-symbols-and-strings/
Ответ 11
символ неизменен, а строка изменчива.
когда мы выполняем какую-либо операцию со строкой, она создает новый объект и занимает память. Поскольку мы выполняем все больше и больше операций над строкой, это означает, что мы потребляем все больше и больше памяти.
Символ - это объект, который является неизменным, значит, если мы выполняем какую-либо операцию, он выполняет изменения в исходном объекте. Он не будет создавать никаких объектов, поэтому он более выгоден.
для получения дополнительной информации, вы можете нажать здесь