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

Bry*_*cke 79 ruby

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

if mystring.eql?(yourstring)
 puts "same"
else
 puts "different"
end
Run Code Online (Sandbox Code Playgroud)

这是在没有测试对象相等性的情况下执行此操作的正确方法吗?

我正在寻找最简洁的方法来根据内容测试字符串.

用括号和问号,这看起来有点笨重.

Jas*_*att 137

根据http://www.techotopia.com/index.php/Ruby_String_Concatenation_and_Comparison

做任何一个

mystring == yourstring
Run Code Online (Sandbox Code Playgroud)

要么

mystring.eql? yourstring
Run Code Online (Sandbox Code Playgroud)

是等价的.

  • 这是对的.身份比较器是"相等的". (4认同)

she*_*onh 13

您的代码示例没有扩展您的主题的一部分,即符号,因此问题的一部分未得到答复.

如果你有两个字符串,foo和bar,并且两者都可以是字符串或符号,你可以用它来测试相等性

foo.to_s == bar.to_s
Run Code Online (Sandbox Code Playgroud)

跳过具有已知类型的操作数的字符串转换效率更高一些.所以如果foo总是一个字符串

foo == bar.to_s
Run Code Online (Sandbox Code Playgroud)

但效率提升几乎肯定不值得为代表呼叫者的任何额外工作.

在Ruby 2.2之前,为了进行比较(使用字符串或符号),请避免实例化不受控制的输入字符串,因为符号不是垃圾收集的,因此您可以通过资源耗尽来打开拒绝服务.将符号的使用限制为您控制的值,即代码中的文字和受信任的配置属性.

Ruby 2.2 引入了符号的垃圾收集.

  • `foo.intern == bar.intern`会更好 - 实际上,字符串比从符号创建字符串更有效.(如果先前已经实现了给定字符串,则只返回符号.) (6认同)
  • 实际上我认为用字符串创建符号并不是一个好主意,只是为了节省一些比较,因为如果字符串不匹配会泄漏符号.符号不是垃圾收集的,因此如果您不打算保留符号,则不应创建符号,否则您将创建拒绝服务攻击的向量. (4认同)