Как создать ключевой хеш без кавычек

Я пытаюсь создать заголовок для моего 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
Другие вопросы по тегам