String 使用clojure在映射上循环的每次迭代中追加到数组的最佳方式是什么?
我已经创建了一个结构,它可以从一个映射中构建一个URL查询,但是它不是线程安全的,因为它依赖于一个定义的变量,而这个变量可能不需要,那么什么是最好的方法呢String 使用clojure在映射上循环的每次迭代中追加到数组的最佳方式是什么?,string,loops,clojure,String,Loops,Clojure,我已经创建了一个结构,它可以从一个映射中构建一个URL查询,但是它不是线程安全的,因为它依赖于一个定义的变量,而这个变量可能不需要,那么什么是最好的方法呢 (def charset "UTF-8") (defn make-query [params] (do (def tmpa []) (doseq [keyval params] (def tmpa (into tmpa
(def charset "UTF-8")
(defn make-query
[params]
(do
(def tmpa [])
(doseq [keyval params]
(def tmpa
(into tmpa
[(str
(java.net.URLEncoder/encode (name (first keyval)) charset)
"="
(java.net.URLEncoder/encode (apply (first keyval) [params]) charset)
)]
)
)
)
(clojure.string/join "&" tmpa)
)
)
当您需要在函数中使用中间值时,使用嵌套的
def
s并不是真正的方法,这就是let
表单的目的。还要注意的是,def
创建了一个顶级变量,因此即使在makequery
函数返回后,在声明函数的名称空间中仍然会有一个tmpa
var
您发布的函数具有命令式风格,因为它使用doseq
(用于副作用)并在循环的每次迭代中更改tmpa
var的值
函数方法是reduce
ing键-值对,并通过在每次调用reduce函数时将键和值连接到查询字符串来构建结果。以下是如何实现这一目标的示例:
(def charset "UTF-8")
(defn make-query
[params]
(reduce (fn [query [k v]]
(str query
(java.net.URLEncoder/encode (name k) charset)
"="
(java.net.URLEncoder/encode (str v) charset)
"&"))
""
params))
(make-query {:name "clojure" :year 2014})
;= "name=clojure&year=2014&"
当一个人来自命令式和面向对象的背景时,需要一些时间来习惯这种思维方式,但通过实践,它会变得容易得多
希望有帮助。当您需要在函数中使用中间值时,使用嵌套的
def
s并不是真正的方法,这就是let
表单的用途。还要注意的是,def
创建了一个顶级变量,因此即使在makequery
函数返回后,在声明函数的名称空间中仍然会有一个tmpa
var
您发布的函数具有命令式风格,因为它使用doseq
(用于副作用)并在循环的每次迭代中更改tmpa
var的值
函数方法是reduce
ing键-值对,并通过在每次调用reduce函数时将键和值连接到查询字符串来构建结果。以下是如何实现这一目标的示例:
(def charset "UTF-8")
(defn make-query
[params]
(reduce (fn [query [k v]]
(str query
(java.net.URLEncoder/encode (name k) charset)
"="
(java.net.URLEncoder/encode (str v) charset)
"&"))
""
params))
(make-query {:name "clojure" :year 2014})
;= "name=clojure&year=2014&"
当一个人来自命令式和面向对象的背景时,需要一些时间来习惯这种思维方式,但通过实践,它会变得容易得多
希望有帮助。谢谢。我知道def是公开的,它只是麻烦,但它是唯一有效的东西。我需要稍微使用一下这个方法,因为连接很重要,因为在查询中不应该有尾随。(defn-make-query[params](让[arr(reduce(fn[query[k v]])(into-query[(str(java.net.URLEncoder/encode(name k)“UTF-8”)=“(java.net.URLEncoder/encode(str v)“UTF-8”))))[]参数](clojure.string/join“&“arr”))谢谢。我知道def是公开的,它只是麻烦,但它是唯一有效的东西。我需要稍微使用一下这个方法,因为连接很重要,因为在查询中不应该有尾随。(defn-make-query[params](让[arr(reduce(fn[query[kv]])(into-query[(str(java.net.URLEncoder/encode(name k)“UTF-8”)=“(java.net.URLEncoder/encode(str v)“UTF-8”))))[]参数](clojure.string/join“&“arr”))