2009-11-10 40 views

回答

10

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

如果你有两个字符串,foo和酒吧,都与

foo.to_s == bar.to_s 

可以是一个字符串或一个符号,你可以测试平等这一点更有效地跳过与操作数的字符串转换已知类型。所以如果foo总是一个字符串

foo == bar.to_s 

但是效率的增益几乎肯定不值得要求代表调用者做任何额外的工作。

在Ruby 2.2之前,为了比较目的(避免使用字符串或符号)避免为了比较的目的而输入不受控制的输入字符串,因为符号不是垃圾收集的,所以您可以打开自己以通过资源耗尽拒绝服务。将符号的使用限制为您控制的值,即代码中的文字和可信的配置属性。

Ruby 2.2 introduced garbage collection of symbols

+6

'foo.intern == bar.intern'会更好 - 实际上一个字符串比一个符号创建一个字符串更高效。 (如果一个给定的字符串已经被实施过,它只是返回符号。) – Chuck 2009-11-12 03:41:59

+0

非常好,感谢您花时间添加这个。 – sheldonh 2009-11-12 09:28:10

+4

其实我不认为从一个字符串中创建一个符号是一个好主意,只是为了节省一些比较,因为如果字符串不匹配,会泄漏符号。符号不会被垃圾收集,因此如果您不打算保留它们,则不应该创建该符号,否则您将创建一个用于拒绝服务攻击的向量。 – Patru 2013-08-13 03:11:27

相关问题