【问题标题】:adding a key to vector of values in Clojure在 Clojure 中为值向量添加键
【发布时间】:2014-01-18 19:19:24
【问题描述】:

我有一个字符串向量(尽管实际上可以是任何东西),我想创建一个新的映射条目向量,键是某个关键字。

例如,给定:

["foo" "bar" "baz"]

我想得到

[{:message "foo"} {:message "bar"} {:message "baz"}]

应用这种转换最惯用的方法是什么?

谢谢!

【问题讨论】:

    标签: clojure


    【解决方案1】:

    这是一个见仁见智的问题。一些选项:

     (into [] (for [x ["foo" "bar" "baz"]] {:message x}))
    
     (mapv hash-map (repeat :message) ["foo" "bar" "baz"])
    
     (mapv (partial assoc {} :message) ["foo" "bar" "baz"])
    
     (reduce #(conj % {:message %2}) [] ["foo" "bar" "baz"])
    

    【讨论】:

    • 谢谢!我也做了这个:(map #(hash-map :message %) ["foo" "bar" "baz"])
    【解决方案2】:

    我认为 A. Webb 提供了一些非常好的选择。
    我的建议是为广大读者提供可读性:

     (mapv (fn[x] {:message x}) ["foo" "bar" "baz"])
    

    另外,如果你不需要矢量,

     (map (fn[x] {:message x}) ["foo" "bar" "baz"])
    

    将被更多人阅读。

    【讨论】:

    • 这纯粹是讽刺吗:D? (如果不是,请使用比x 更具表现力的参数名称,例如msg 以覆盖更广泛的受众)。
    • 我认为重要的是保持简单。也就是说,使用每个 clojure 程序员都理解的构造和函数,除非有充分的理由不这样做。程序代码的阅读次数多于编写次数。不,将 x 用作通用函数参数并不具有讽刺意味,因为大多数程序员很自然地将其视为一个符号,而不会在头脑中将其作为一个词大声朗读。即使对一个高中生来说,“x 的函数”这个概念也应该很容易理解。
    • 按照 Clojure 的示例本身,集合的参数不应该是“coll”吗?参见,作为众多示例中的一个,(doc vec)
    • 我认为这仍然过于具体,因为它可能真的是任何东西。除了说“foo”,你还可以有一个整数、一个 java 对象、一个 Ring 响应或任何你喜欢的东西。
    • 是的,请随意忽略我上面的评论,我在想你可能会环绕上面的代码。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多