Ruby:字符串不匹配

时间:2011-11-09 20:19:42

标签: ruby

我正在测试两个字符串,看看它们是否相等。 一个字符串只是一个简单的字符串:"\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

完全相同

3 个答案:

答案 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如果需要,可以提供有关单引号字符串和双引号字符串之间差异的更多信息。