Как создать ключевой хеш без кавычек
Я пытаюсь создать заголовок для моего API, как это:
header = {:Content-Type => "application/json"}
У меня проблема с ключом, который содержит тире. Если я использую :"Content-Type"
или же "Content-Type".to_sym
, результат - ключ как это:
"Content-Type".to_sym # => :"Content-Type"
Я обнаружил, что некоторые люди говорят, что я могу использовать to_sym.inspect
создать символ без кавычек, но это не сработало.
"Content-Type".to_sym.inspect # => ":\"Content-Type\""
1 ответ
Это классический пример значения против представления значения.
Позвольте мне привести вам несколько примеров:
'"'
#=> "\""
'
'
#=> "\n"
'a-b'.to_sym
#=> :"a-b"
Все вышеперечисленные блоки имеют одинаковое общее. Вывод не является литералом, но должен интерпретироваться в контексте.
"\""
не строка, содержащая обратную косую черту и двойные кавычки, а строка, содержащая одну двойную кавычку (\"
представляет двойные кавычки в контексте двойных кавычек)."\n"
это не строка, содержащая обратную косую черту и "n", а строка, содержащая один символ новой строки (\n
представляет новую строку в контексте двойных кавычек).:"a-b"
не является символом, содержащим"a-b"
, но символ, содержащийa-b
(:"..."
представляет символ, который не может быть проанализирован без кавычек).
Это видно, когда мы распечатываем значения.
puts "\""
# "
#=> nil
puts "\n"
#
# => nil
puts :"a-b"
# a-b
#=> nil
Как вы можете видеть в приведенном выше блоке кода, кавычки на самом деле не являются частью символа. Они только для символьного представления.
Если символ на самом деле содержит кавычки, представление будет выглядеть так:
a = '"a-b"'.to_sym
#=> :"\"a-b\""
puts a
# "a-b"
#=> nil