测试Ruby字符串或符号的字符串相等性(不是对象相等性)的最简洁方法?


86

我总是这样做来测试Ruby中的字符串相等性:

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

这是不测试对象相等性的正确方法吗?

我正在寻找一种最简单的方法来根据其内容测试字符串。

带有括号和问号,这似乎有些笨拙。

Answers:



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会更好-嵌入字符串平均比从符号创建字符串更有效。(如果给定的字符串先前已被预先锁定,则只返回该符号。)
Chuck

4
实际上,我认为从字符串中创建符号只是为了节省一些比较费用不是一个好主意,因为如果字符串不匹配,它将泄漏符号。符号不是垃圾收集的,因此,如果您不打算保留它们,则不应创建它们,否则,您将创建矢量来拒绝服务攻击。
Patru

e,我没想到。谢谢,我已经根据您的评论修改了答案。
sheldonh 2013年

1
这需要重申:“避免对不受控制的输入字符串进行内部处理,因为符号不会被垃圾收集”。谢谢@sheldonh。
Nate 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.