【发布时间】:2009-11-10 19:01:48
【问题描述】:
我总是这样做来测试 Ruby 中的字符串相等性:
if mystring.eql?(yourstring)
puts "same"
else
puts "different"
end
这是在不测试对象相等性的情况下执行此操作的正确方法吗?
我正在寻找基于字符串内容测试字符串的最简洁方法。
加上括号和问号,这看起来有点笨拙。
【问题讨论】:
标签: ruby
我总是这样做来测试 Ruby 中的字符串相等性:
if mystring.eql?(yourstring)
puts "same"
else
puts "different"
end
这是在不测试对象相等性的情况下执行此操作的正确方法吗?
我正在寻找基于字符串内容测试字符串的最简洁方法。
加上括号和问号,这看起来有点笨拙。
【问题讨论】:
标签: ruby
根据http://www.techotopia.com/index.php/Ruby_String_Concatenation_and_Comparison
做任何一个
mystring == yourstring
或
mystring.eql? yourstring
是等价的。
【讨论】:
您的代码示例没有扩展您的部分主题,即符号,因此部分问题没有得到解答。
如果你有两个字符串,foo 和 bar,并且两者都可以是字符串或符号,你可以测试相等性
foo.to_s == bar.to_s
在已知类型的操作数上跳过字符串转换会更有效一些。所以如果 foo 总是一个字符串
foo == bar.to_s
但几乎可以肯定的是,不值得代表调用者要求任何额外工作。
在 Ruby 2.2 之前,避免将不受控制的输入字符串用于比较目的(与字符串或符号),因为符号不会被垃圾收集,因此您可能会因资源耗尽而拒绝服务。将符号的使用限制为您控制的值,即代码中的文字和受信任的配置属性。
Ruby 2.2 introduced garbage collection of symbols.
【讨论】:
foo.intern == bar.intern 会更好——平均而言,实习字符串比从符号创建字符串更有效。 (如果给定的字符串之前已经被实习过,它只返回符号。)