Самый краткий способ проверить равенство строк (не равенство объектов) для строк или символов Ruby?

86

Я всегда делаю это, чтобы проверить равенство строк в Ruby:

if mystring.eql?(yourstring)
 puts "same"
else
 puts "different"
end

Это правильный способ сделать это без проверки равенства объектов?

Я ищу наиболее лаконичный способ проверки строк на основе их содержимого.

С круглыми скобками и вопросительным знаком это кажется немного неуклюжим.

Брайан Лок
источник

Ответы:

14

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

Если у вас есть две строки, foo и bar, и обе могут быть строкой или символом, вы можете проверить равенство с помощью

foo.to_s == bar.to_s

Немного эффективнее пропустить преобразование строк в операндах с известным типом. Итак, если foo всегда является строкой

foo == bar.to_s

Но для повышения эффективности почти наверняка не стоит требовать от вызывающего абонента дополнительной работы.

До Ruby 2.2 избегайте интернирования неконтролируемых входных строк с целью сравнения (со строками или символами), потому что символы не собираются сборщиком мусора, и вы можете подвергнуться отказу в обслуживании из-за исчерпания ресурсов. Ограничьте использование символов значениями, которые вы контролируете, т. Е. Литералами в коде и надежными свойствами конфигурации.

Ruby 2.2 представил сборщик мусора символов .

Шелдон
источник
6
foo.intern == bar.internбыло бы лучше - интернирование строки в среднем более эффективно, чем создание строки из символа. (Если данная строка была ранее интернирована, она просто возвращает символ.)
Чак,
4
На самом деле я не думаю, что создавать символ из строки просто для того, чтобы немного сэкономить на некоторых сравнениях, поскольку это приведет к утечке символов, если строка не совпадает. Символы не собираются сборщиком мусора и поэтому не должны создаваться, если вы не собираетесь их хранить, в противном случае вы создадите вектор для атаки отказа в обслуживании.
Patru
Боже, я об этом не подумал. Спасибо, я изменил свой ответ на основе вашего комментария.
Sheldonh
1
Это необходимо повторить: «Избегайте интернирования неконтролируемых входных строк [...], потому что символы не собираются сборщиком мусора». Спасибо @sheldonh.
Nate