Создать ключевое слово из числа

ТЛ; др

Как я могу получить ключевое слово из числа в 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 если вы не знаете пространство клавиш и / или не делаете некоторые удобства.

Другие вопросы по тегам