我总是这样做是为了测试字符串平等红宝石:为Ruby字符串或符号测试字符串相等(不是对象相等)的最简洁方法?
if mystring.eql?(yourstring)
puts "same"
else
puts "different"
end
是,这是做这个未经测试对象平等的正确方法?
我正在寻找最简洁的方式来根据内容测试字符串。
有了括号和问号,这看起来有点笨拙。
我总是这样做是为了测试字符串平等红宝石:为Ruby字符串或符号测试字符串相等(不是对象相等)的最简洁方法?
if mystring.eql?(yourstring)
puts "same"
else
puts "different"
end
是,这是做这个未经测试对象平等的正确方法?
我正在寻找最简洁的方式来根据内容测试字符串。
有了括号和问号,这看起来有点笨拙。
根据http://www.techotopia.com/index.php/Ruby_String_Concatenation_and_Comparison
否则要么
mystring == yourstring
或
mystring.eql? yourstring
是等价的。
您的代码示例未展开部分主题,即符号,因此问题的一部分未得到答复。
如果你有两个字符串,foo和酒吧,都与
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'会更好 - 实际上一个字符串比一个符号创建一个字符串更高效。 (如果一个给定的字符串已经被实施过,它只是返回符号。) – Chuck 2009-11-12 03:41:59
非常好,感谢您花时间添加这个。 – sheldonh 2009-11-12 09:28:10
其实我不认为从一个字符串中创建一个符号是一个好主意,只是为了节省一些比较,因为如果字符串不匹配,会泄漏符号。符号不会被垃圾收集,因此如果您不打算保留它们,则不应该创建该符号,否则您将创建一个用于拒绝服务攻击的向量。 – Patru 2013-08-13 03:11:27
这是正确的。身份比较器是“相等的”。 – Chuck 2009-11-10 19:08:12