我是clojure的新手,所以请耐心等待。
编写宏如下:
`(let [query# (:query-params ~'+compojure-api-request+)
options# (select-keys query# [:sort-by :from :to])])
let
块的第一行从query-params
解构http request
- 产生这种结构:
{sort-by billing-account/name, from 0, to 10, payment-due , payment-method , search }
麻烦在于第二行 - 当我使用select-keys
时它返回一张空地图,但是当我说例如(first query#)
时 - 输出如下所示:[sort-by billing-account/name]
< / p>
有人可以解释为什么select-keys
不起作用吗?
P.S。试过(get query# :from) & (:from query#)
- 那里也没有运气。
UPD
键是字符串,而不是关键字 - 因此使用字符串作为键可以正常工作。
答案 0 :(得分:1)
顺便说一下,您还可以使用:strs
:
(let [m {"sort-by" "billing-account/name",
"from" "0",
"to" "10",
"payment-due" nil,
"payment-method", "search"}
{:strs [sort-by from to payment-due payment-method]} m]
(println sort-by from to payment-due payment-method))
;;=> billing-account/name 0 10 nil search
有关解构语法的完整说明,请参阅https://clojure.org/guides/destructuring。
答案 1 :(得分:0)
我认为您对关键字,符号和字符串之间的差异感到困惑。在您的评论中,您说他们是符号,但在您的编辑中,您说他们是字符串。
你应该读一下差异:
惯用的事情通常是喜欢使用关键字作为地图键,尽管来自互联网(json,http标题等)的东西有时都是字符串。
要直接回答您的问题,传递给select-keys
的密钥需要(使用=
函数)与地图中的密钥相等,因此在这种情况下,它们必须是相同的类型
;; For example
(select-keys {'foo 1 'bar 2} ['foo]) ;=> {foo 1}
(select-keys {:foo 1 :bar 2} [:foo]) ;=> {:foo 1}
(select-keys {"foo" 1 "bar" 2} ["foo"]) ;=> {"foo" 1}
我还质疑这是一个宏的必要性,是否有一个原因是一个普通的功能不起作用?