我總是這樣做是爲了測試字符串平等紅寶石:爲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