首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从数字创建关键字

从数字创建关键字
EN

Stack Overflow用户
提问于 2016-08-28 14:19:20
回答 1查看 1.6K关注 0票数 5

tl;dr

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

代码语言:javascript
复制
(keyword 22)
;;=> :22 but in fact returns nil.

背景

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

代码语言:javascript
复制
{:companies
  {:22 {:description ... } ; A company.
   :64 {:description ... }
   ...                    }
{:offers
  [{:description ... } ; An offer.
   {:description ... }
   ...                ]

:offers背后的向量中的每个报价都有一个:companyId,它代表:companies中的一个键。一旦收到响应,我就会reset!一个单元格 (类似于原子) query

现在,我想迭代每一个提供,并调用一个函数offer-tpl来创建相应的HTML。为了做到这一点,offer-tpl需要报价本身以及相关公司:

代码语言:javascript
复制
(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)))可以实现这个目的,但是没有其他方法可以做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-28 15:47:55

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

您获得:22的原因可能是因为JSON转换的keywordize-keys选项。例如:

cljs-http默认为jsonp:http/core.cljs#L 115的keywordize键,但是在本例中您可以(而且应该)传递一个标志来禁用keywordize。

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

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

http://clojure.org/reference/reader目前声明:

关键字-关键字类似于符号,除了:它们可以而且必须以冒号开头,例如:fred。它们不能包含“。”或者叫什么课。与符号类似,它们可以包含一个名称空间:person/name --以两个冒号开头的关键字将在当前名称空间中解析:在用户名称空间中,::rect被读为: user /rect

那就是

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

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

关键字函数返回无效输入的结果,但这不是背书,这只是因为检查不正确的输入将是Clojure的核心部分的性能开销。

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

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39192226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档