2009-11-10 94 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