我正在测试两个字符串,看看它们是否相等。
一个字符串只是一个简单的字符串:"\17"
另一个解析为:"\17"
num = 7
num2 = "\17"
parsed_num = "\1#{num}"
puts parsed_num.class
puts num2.class
if parsed_num == num2
puts 'Equal'
else
puts 'Not equal'
end
它返回:
String
String
Not equal
我的目标是让parsed_num
与文字num2
答案 0 :(得分:3)
如果你使用“\ 17”反斜杠转义,它将被解释为“\ 0017”,其中17将是八进制数字等于'F'hex:
"\17" # => "\u000F"
因为你的字符串使用双引号。
您可以借助此代码段获得所需内容,例如:
num = 7
num2 = "\\17"
parsed_num = "\\1#{num}"
if parsed_num == num2
puts 'Equal'
else
puts 'Not equal'
end
# => Equal
你可以看到你在反斜杠的帮助下得到这个结果以逃避另一个反斜杠:)
答案 1 :(得分:3)
我将采取相反的答案并假设“\ 17”正确,然后考虑this code:
num = 7
num2 = "\17"
puts "ni #{num2.inspect}"
# extra \ to fix error, for demo
parsed_num = "\\1#{num}"
puts "pi #{parsed_num.inspect}"
# for note, but ICK!!!
p2 = eval('"' + parsed_num + '"')
puts "p2i #{p2.inspect}"
puts "p2= #{p2 == num2}"
dec = (10 + num).to_s.oct
p3 = dec.chr
puts "p3i #{p3.inspect}"
puts "p3= #{p3 == num2}"
结果:
ni "\017"
pi "\\17"
p2i "\017"
p2= true
p3i "\017"
p3= true
"\1#{num}"
不起作用的原因是字符串文字 - 和嵌入的转义序列 - 在解析期间处理,而字符串插值本身(#{}
)在运行时发生。 (这是必需的,因为谁知道num
可能会发生什么?)
在p2
的情况下,我使用了eval
,它解析然后执行提供的代码。那里的代码相当于eval('"\17"')
,因为parsed_num
包含3个字母的字符串:\17
。 (请注意,这种方法通常被认为是错误的!)
在p3
的情况下,我手动执行了解析器对\octal
的字符串插值所做的操作:获取octal
的值,in,well,octal,然后将其转换为具有相应值的“字符”。
快乐的编码。
答案 2 :(得分:1)
使用单引号,以便涉及的字符串是您正在设置的文字内容:
num = 7
num2 = '\17'
parsed_num = '\1' + String(num)
if parsed_num == num2
puts 'Equal'
else
puts 'Not equal'
end
这会产生'Equal' - 所需的结果。 Here's a link如果需要,可以提供有关单引号字符串和双引号字符串之间差异的更多信息。