Clojure koans 解构示例

Clojure koans destructuring example

我目前正在网上查看与解构相关的 clojure koan 参数但无法传递它

公案如下:

给出的数据:

(def test-address
  {:street-address "123 Test Lane"
   :city "Testerville"
   :state "TX"})

我们有

(= "Test Testerson, 123 Test Lane, Testerville, TX" 
     (  ----missing part-----       ["Test" "Testerson"] test-address))

我的一个解决方案是:

 (= "Test Testerson, 123 Test Lane, Testerville, TX" 
     ( apply 
        (fn[ a & more ] 
          ( let [ x (reduce str (interpose " " a))  
                  y (reduce str (interpose ", " (vals more) ))]  
                  (str x ", " y)))  ["Test" "Testerson"] test-address))

这在 repl 中有效,但在给定站点上无效。所以我的问题是,有没有更好的解决方案?我不确定上面的示例是否设置为寻找更好或特定的解决方案。

您的代码可能失败的一个原因是地图键未排序。 (vals more) 可以而且很可能会在不同版本的 clojure 中给出不同顺序的序列。

您可以尝试的解决方案是

((fn 
   [[f-name l-name] {:keys [street-address city state]}] 
     (format "%s %s, %s, %s, %s" f-name, l-name, street-address, city, state)) 
     ["Test" "Testerson"] {:street-address "123 Test Lane", :city "Testerville", :state "TX"})

编辑:clojurescript 没有 format 实现 [1]。您可以将整个 format 表格替换为以下 str 表格,

(str f-name " " l-name ", " street-address ", " city ", " state)

我试过了,很有效。

[1] - http://dev.clojure.org/jira/browse/CLJS-324

这适用于 Koan 网站和 repl:

(fn [x m] 
    (clojure.string/join ", " 
      (cons (clojure.string/join " " x) 
        (reverse (sort-by count (vals m)))
      )
    )
 )

cons将两个新字符串 ["Test" "Testerson"] join 合并到 test-address 的值,并使结果字符串的顺序与使用 sort-byreverse 回答。

这是您的代码,稍作更正:

(= "Test Testerson, 123 Test Lane, Testerville, TX" 
    (apply 
    (fn [a & more] 
      (let [x (reduce str (interpose " " a))  
            y (reduce str (interpose ", " (reverse (sort-by count (vals more)))))]  
        (str x ", " y)))
    ["Test" "Testerson"] test-address)
 )

=> ;true