根据数字创建关键字



tl;dr

如何从ClojureScript:中的数字派生关键字

(keyword 22)
;;=> :22 but in fact returns nil.

背景

在我的ClojureScript/Hoplon应用程序中,我通过cljs-HTTP发出HTTP请求。我收到的部分回复如下:

{:companies
  {:22 {:description ... } ; A company.
   :64 {:description ... }
   ...                    }
{:offers
  [{:description ... } ; An offer.
   {:description ... }
   ...                ]

:offers后面的向量内的每个要约都有一个:companyId,它表示:companies中的一个密钥。一旦我收到响应,我就reset!一个细胞(类似于原子(query

现在,我想对每个offer进行迭代,并调用一个创建相应HTML的函数offer-tpl。为了做到这一点,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)))可以做到这一点,但没有其他方法吗?

(keyword "22")(keyword (str 22))返回:22

获得:22的原因可能是JSON翻译的keywordize-keys选项。例如:

cljs-http默认为jsonp的keywordize密钥:https://github.com/r0man/cljs-http/blob/1fb899d3f9c5728521786432b5f6c36d1d7a1452/src/cljs_http/core.cljs#L115但在这种情况下,您可以(也应该(传入一个禁用关键字化的标志。

并非JSON中的所有键都适用于Clojure关键字化。例如,JSON键中的空格是有效的,但在Clojure中无效。

请注意,数字关键字可能不正确。https://clojuredocs.org/clojure.core/keyword#example-542692cec026201cdc326d70这个警告似乎已经从当前的Clojure网站上删除了,所以也许这意味着什么,但我不确定是什么。

http://clojure.org/reference/reader目前,

关键字-关键字类似于符号,除了:它们可以而且必须以开头带有冒号,例如:fred。它们不能包含"."或名称类。像符号一样,它们可以包含一个名称空间,:person/name关键字在当前命名空间中解析以两个冒号开头的:in用户名称空间::rect读作:user/rrect

以及

符号以非数字字符开头,可以包含字母数字。

此关键字定义不包括:22:with spaces

关键字函数返回无效输入的结果,但这不是认可,这只是因为在Clojure的核心部分中,检查不正确的输入会带来性能开销。

简言之,并不是所有的JSON键都能转换为关键字,所以您应该避免keywordize-keys,除非您知道密钥空间和/或这样做提供了一些便利。

最新更新