【问题标题】:Clojure maps to named keys syntaxClojure 映射到命名键语法
【发布时间】:2014-02-07 18:20:57
【问题描述】:

我猜有一种我找不到的简单方法可以做到这一点。我想将映射传递给将命名值绑定到键的方法,例如

(defn my-method [ & {:keys [ a b c ] }] ...

如果使用例如

(我的方法:a 1 :b 2 :c 3)

但我想用提供的地图来调用它,例如看起来像的东西

(def m {:a 1 :b 2 :c 3})

(我的方法 m)

有没有一种简单的方法可以将映射转换为所需的参数列表?

【问题讨论】:

    标签: clojure


    【解决方案1】:

    它不漂亮但是:

    (apply my-method (mapcat identity m))
    

    或按照 cmets 中的建议:

    (apply my-method (apply concat m))
    

    【讨论】:

    • mapcat identity 很奇怪。有时我会写mapcat seq,因为它最短,但apply concat 是传统方式。
    • 我想我在很多年前从某人那里看到了mapcat identity(也许是chouser,我把所有聪明的事情都归咎于chouser)并且它卡住了。同意apply concat 似乎更能代表意图。
    • 我发现定义:(defn apply-map [f & args] (apply f (concat (butlast args) (apply concat (last args))))) 很有用
    【解决方案2】:

    只需去掉 & 符号:

    > (defn my-method [{:keys [a b c]}] (+ a b c))
    > (my-method m)
    6
    

    【讨论】:

    • 问题问“给定这种形状的方法,我该如何称呼它?”。这个答案的形式是:“改变方法”,所以我认为这不是一个好的答案。但也许这不是一个好问题。 :)
    • 啊,我把它读为调用他写的方法。在无法更改方法的情况下,我认为没有比您的答案更好的解决方案了。
    猜你喜欢
    • 2017-09-29
    • 2012-07-02
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2022-07-29
    • 1970-01-01
    • 2014-04-08
    相关资源
    最近更新 更多