我我要採取相反的答案,認爲「\ 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
值,在,好了,八進制,然後將其轉換爲具有相應值的「字符」。
快樂編碼。
'p3.encoding'是'US-ASCII','num2.encoding'是'UTF-8',所以它們在某種意義上不是「完全相同」。 –
謝謝。它完美的作品。 – user1038486
@undur_gongor感謝您指出,我是內化無效:( – 2011-11-09 21:03:14