【问题标题】:Idiomatic way to join a vector to either a plain keyword or a vector of keywords将向量加入普通关键字或关键字向量的惯用方法
【发布时间】:2015-09-22 22:03:50
【问题描述】:

寻找最简单或最惯用的方法来处理可能是简单关键字或关键字向量的输入。也许是一个将普通关键字转换为列表的函数。尽量避免使用 if 子句,也尽量避免过多的函数链接。

 (defn togethr [v1]
   (into [] (flatten (into [:a] (vector v1))))

 (togethr :b) 
 ; => [:a :b]

 (togethr [:b :c])
 ; => [:a :b :c]

我在这里链接了 4 个函数调用,我怀疑有一种更简单(更惯用)的方法。

【问题讨论】:

  • Arthur 的答案是一个很好的答案,但是回到更广泛的上下文,有一个可能是关键字的参数,或者是一组关键字通常是一种反模式。更改调用代码以一致地传递向量关键字可能会更好。 Stuart Sierra 甚至为此创造了一个术语:‘heisenparameter’
  • 这是我一直在寻找的,但无法表达。虽然 Arthur 确实回答了我的问题,我非常感谢他花时间回答我的问题,但我很感谢你退后一步,引导我走上一条比直接给我要求的更好的道路!跨度>

标签: vector clojure keyword


【解决方案1】:

Arthur 的回答很好,但回到更广泛的上下文,有一个可能是关键字的参数,或者是关键字的集合通常是一种反模式。更改调用代码以一致地传递关键字向量可能会更好。 Stuart Sierra 甚至为此创造了一个术语:‘heisenparameter’

【讨论】:

    【解决方案2】:

    在这种情况下使用 if 并不罕见。它归结为一个函数调用和一个 if 表达式:

    user> (defn togethr [thing]
            (into [:a] (if (sequential? thing) thing [thing])))
    #'user/togethr
    user> (togethr 1)
    [:a 1]
    user> (togethr :b)
    [:a :b]
    user> (togethr [:b :c])
    [:a :b :c]
    

    【讨论】:

      猜你喜欢
      • 2022-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      相关资源
      最近更新 更多