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?)

在我以前evalp2的情况下,解析并执行所提供的代码。代码相当于eval('"\17"'),因为parsed_num包含3个字母的字符串:\17。 (!请注意,这种方法是通常被认为是不好的

p3的情况下,我手工做的解析器做什么的\octal字符串插值:拿了octal值,在,好了,八进制,然后将其转换为具有相应值的“字符”。

快乐编码。

+1

'p3.encoding'是'US-ASCII','num2.encoding'是'UTF-8',所以它们在某种意义上不是“完全相同”。 –

+0

谢谢。它完美的作品。 – user1038486

+0

@undur_gongor感谢您指出,我是内化无效:( – 2011-11-09 21:03:14

使用单引号,以便所涉及的字符串是您正在设置的字面值:

num = 7 
num2 = '\17' 

parsed_num = '\1' + String(num) 
if parsed_num == num2 
    puts 'Equal' 
else 
    puts 'Not equal' 
end 

这产生'相等' - 期望的结果。 Here's a link有关单引号字符串和双引号字符串之间的区别的更多信息(如果需要)。

+0

是否可以在不改变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 

正如你可以看到你得到这个结果与反斜线的帮助下逃离一个反斜杠:)

+0

如果将'parsed_num'从'“\ 1#{num}”'更改为'“\ xF”,可以在不改变num2的情况下使它们相等吗? – user1038486

+0

如果将' '例如 – WarHog