我是Clojure的新手,我正在使用ring.velocity
开发一个webapp。
这是我的ring.velocity.core/render
方法:
(defn render
[tname & kvs]
"Render a template to string with vars:
(render :name \"dennis\" :age 29)
:name and :age are the variables in template. "
(let [kvs (apply hash-map kvs)]
(render-template *velocity-render tname kvs)))
对于这个简单的例子,它工作正常:
(velocity/render "test.vm" :name "nile")
但有时,我们无法硬编码键值对。一种常见的方式:
(defn get-data [] {:key "value"}) ;; define a fn get-data dynamic.
(velocity/render "test.vm" (get-data));; **this go wrong** because in render fn , called (apply hash-map kvs)
有错误:
No value supplied for key: ....
看起来它被视为单个值。我已将类型更改为[]
,{}
和()
,但其中每个都失败了。
我的问题是:clojure中的& kvs
是什么意思?如何动态创建它并将其传递给方法?
(defn params-test [a & kvls]
(println (apply hash-map kvls)))
(defn get-data []
[:a "A"])
(defn test[]
(params-test (get-data))
No value supplied for key:((:a "A"))
答案 0 :(得分:1)
这里的问题是你试图从单个列表参数而不是参数列表创建一个哈希映射。
使用
(apply hash-map kvls)
而不是
(hash-map kvls)
在原始问题中,您可以尝试使用部分
(apply (partial velocity/render "test.vm") (get-data))