Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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

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

  1. Символы неизменны: их значение остается постоянным.
  2. Многократное использование одного и того же символа имеет один и тот же идентификатор объекта и является одним и тем же объектом по сравнению со строкой, которая каждый раз будет другим объектом с уникальным идентификатором объекта.
  3. Вы не можете вызвать любой из методов 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.

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

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

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

Ответ 11

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

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

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

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