我在ruby 2.3.3版本中有以下字符串:
'\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x01u\x00\x00\x01u\b'
我想将它与另一个字符串进行比较。但是,会发生以下情况:
x = '\x89PNG\r\n\x1A\n\x00\x00\x00\rIHDR\x00\x00\x01u\x00\x00\x01u\b'
=> "\\x89PNG\\r\\n\\x1A\\n\\x00\\x00\\x00\\rIHDR\\x00\\x00\\x01u\\x00\\x00\\x01u\\b"
在其中添加额外的斜杠会弄乱比较。同样令人困惑的是,发生了以下事情:
x.gsub("\\\\", "\\")
=> "\\x89PNG\\r\\n\\x1A\\n\\x00\\x00\\x00\\rIHDR\\x00\\x00\\x01u\\x00\\x00\\x01u\\b"
我尝试使用%{}和%Q []双引号。它们都没有简单地存储字符串而不解释转义序列。如何存储此字符串而不更改它?
答案 0 :(得分:5)
只要字符串共享相同的编码,字节比较将是一种很好的解决方案,而无需额外的转义。
str.bytes == other.bytes
要显示反斜杠,只需用一个反斜杠将其转义即可:
puts '\\'
\
另外,根据您的确切用法,可以使用<=>
运算符:
(str <=> other).zero?
编辑
要进一步扩展,如果您执行以下操作,则显示的内容会有所不同:
a = '\\'
p a
=> '\\'
这将显示为两个反斜杠,但实际上它仍然是单个字符,而不是两个。
a = '\\'
a.bytes
=> [92] # ASCII code for a backslash (single byte)