Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 使用clojure在映射上循环的每次迭代中追加到数组的最佳方式是什么?_String_Loops_Clojure - Fatal编程技术网

String 使用clojure在映射上循环的每次迭代中追加到数组的最佳方式是什么?

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

我已经创建了一个结构,它可以从一个映射中构建一个URL查询,但是它不是线程安全的,因为它依赖于一个定义的变量,而这个变量可能不需要,那么什么是最好的方法呢

(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”))