I собираюсь взять противоположный ответ, и предположим, что «\ 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
содержит трехбуквенную строку: \17
. (! Обратите внимание, что этот подход обычно считается плохим)
В случае p3
я вручную сделал то, что парсер для строки интерполяции \octal
: взял значение из octal
, в, ну, восьмеричной, а затем преобразует его в «символ» с соответствующим значением.
Счастливое кодирование.
' p3.encoding' является 'US-ASCII', 'num2.encoding' является 'UTF-8', поэтому они не являются« точно такими же »в некотором смысле. –
Спасибо. Он работает отлично. – user1038486
@undur_gongor Спасибо, что указали это, я интериоризую: –