Создать ключевое слово из числа
ТЛ; др
Как я могу получить ключевое слово из числа в ClojureScript:
(keyword 22)
;;=> :22 but in fact returns nil.
Фон
В моем приложении ClojureScript/Hoplon я делаю HTTP-запросы через cljs-http. Части ответа, который я получаю, выглядят так:
{:companies
{:22 {:description ... } ; A company.
:64 {:description ... }
... }
{:offers
[{:description ... } ; An offer.
{:description ... }
... ]
Каждое предложение в векторе позади :offers
имеет :companyId
который представляет собой ключ в :companies
, Как только я получу ответ, я reset!
клетка (похожая на атом) query
,
Теперь я хотел бы перебрать каждое предложение и вызвать функцию offer-tpl
это создает соответствующий HTML. Для того, чтобы сделать это, offer-tpl
Требуется само предложение, а также связанная компания:
(for [offer (:offers @query)]
(offer-tpl offer (get-in @query [:companies (keyword (:companyId offer))]))))))
Несмотря на то, что это, безусловно, можно сделать более элегантно (предложения очень ценятся), get-in
не работает (:companyId offer)
возвращает номер (например, 22
) но (keyword (:companyId offer))
возвращается nil
, призвание (keyword (str (:companyId offer)))
делает трюк, но нет ли других способов сделать это?
1 ответ
(keyword "22")
или же (keyword (str 22))
возвращается :22
Причина, по которой вы получаете :22
скорее всего из-за keywordize-keys
возможность перевода в формате JSON. Например:
По умолчанию в cljs-http используются ключевые слова-ключи для jsonp: https://github.com/r0man/cljs-http/blob/1fb899d3f9c5728521786432b5f6c36d1d7a1452/src/cljs_http/core.cljs#L115 в этом случае вы должны (и должны) в случае, если вы должны (и в этом случае) должны (и должны) передать (и в этом случае), если вы должны (и должны в этом случае), но в этом случае должны (и должны) передавать (в случае необходимости) флаг для отключения ключевых слов.
Не все ключи в JSON подходят для ключевых слов Clojure. Например, пробелы в ключе JSON допустимы, но не в Clojure.
Помните, что числовые ключевые слова, вероятно, неверны. https://clojuredocs.org/clojure.core/keyword Кажется, что предупреждение было удалено с текущего веб-сайта Clojure, так что, возможно, это что-то значит, но я не уверен, что.
http://clojure.org/reference/reader В настоящее время говорится, что
Ключевые слова - ключевые слова похожи на символы, за исключением: они могут и должны начинаться с двоеточия, например: fred. Они не могут содержать "." или назвать классы. Как и символы, они могут содержать пространство имен: person / name Ключевое слово, которое начинается с двух двоеточий, разрешается в текущем пространстве имен: В пространстве имен пользователя::rect читается как:user/rect
и это
Символы начинаются с нецифровых символов и могут содержать буквенно-цифровые символы.
Это определение ключевого слова исключает :22
а также :with spaces
Ключевое слово function возвращает результат для неверного ввода, но это не одобрение, а просто потому, что проверка на неправильный ввод может привести к снижению производительности в основной части Clojure.
Короче говоря, не все ключи JSON переводятся в ключевые слова, поэтому следует избегать keywordize-keys
если вы не знаете пространство клавиш и / или не делаете некоторые удобства.