Ruby:字符串不匹配
我正在测试两个字符串以查看它们是否相等。 一个字符串就是一个简单的字符串:"\17"
其他被解析到:"\17"
Ruby:字符串不匹配
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
我我要采取相反的答案,认为“\ 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
?)
在我以前eval
的p2
的情况下,解析并执行所提供的代码。代码相当于eval('"\17"')
,因为parsed_num
包含3个字母的字符串:\17
。 (!请注意,这种方法是通常被认为是不好的)
在p3
的情况下,我手工做的解析器做什么的\octal
字符串插值:拿了octal
值,在,好了,八进制,然后将其转换为具有相应值的“字符”。
快乐编码。
使用单引号,以便所涉及的字符串是您正在设置的字面值:
num = 7
num2 = '\17'
parsed_num = '\1' + String(num)
if parsed_num == num2
puts 'Equal'
else
puts 'Not equal'
end
这产生'相等' - 期望的结果。 Here's a link有关单引号字符串和双引号字符串之间的区别的更多信息(如果需要)。
是否可以在不改变num2的情况下使它们相等 – user1038486
如果您使用“\ 17”反斜杠转义,它会被解释成是“\ 0017”,其中17将是一个八进制数字等于“F”(十六进制)
"\17" # => "\u000F"
因为你字符串使用双引号。
你可以达到你想要的东西在这个片段中的帮助,例如:
num = 7
num2 = "\\17"
parsed_num = "\\1#{num}"
if parsed_num == num2
puts 'Equal'
else
puts 'Not equal'
end
# => Equal
正如你可以看到你得到这个结果与反斜线的帮助下逃离一个反斜杠:)
如果将'parsed_num'从'“\ 1#{num}”'更改为'“\ xF”,可以在不改变num2的情况下使它们相等吗? – user1038486
如果将' '例如 – WarHog
'p3.encoding'是'US-ASCII','num2.encoding'是'UTF-8',所以它们在某种意义上不是“完全相同”。 –
谢谢。它完美的作品。 – user1038486
@undur_gongor感谢您指出,我是内化无效:( – 2011-11-09 21:03:14