2011-11-09 251 views
1

我正在測試兩個字符串以查看它們是否相等。 一個字符串就是一個簡單的字符串:"\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

回答

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

在我以前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

1

使用單引號,以便所涉及的字符串是您正在設置的字面值:

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

3

如果您使用「\ 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