【问题标题】:What is the Clojure-way of "do additional stuff when ..."“当......时做额外的事情”的Clojure方式是什么?
【发布时间】:2015-01-23 07:36:58
【问题描述】:

我有一个函数“my-func”,它处理作为参数获取的映射x 并返回一个映射。处理时间很长,所以我把它转移到函数block-with-several-function-calls-on-x 如果传入映射包含:special-key,则应在传出映射中添加一个额外的键值对。

(defn my-func [x]
  (if (contains? x :special-key)
    (assoc (block-with-several-function-calls-on-x x)
           :extra-key true)
    (block-with-several-function-calls-on-x x)))

我真的很想将block-with-several-function-calls-on-x 的代码保留在my-func 中。对于其他编程语言,我只需将该部分的输出保存在变量中,然后(如有必要)添加附加部分,然后返回值。有人告诉我使用let 不是“Clojuresque”。

那么将代码转移到函数(就像我上面所做的那样)是唯一的方法吗?或者是do-additonal-stuff-to-output-of-second-block-function:

(defn my-func [x]
  (do-additional-stuff-to-output-of-second-block
    (when (contains? x :special-key)
      (assoc :extra-key true))
    (block-with-several-function-calls-on-x x)))

【问题讨论】:

  • “使用 let 不是 Clojuresque”——这是荒谬和可笑的错误,说它的人对 Clojure 了解不多
  • 也许是沟通不畅?例如, let 不会创建“变量”。无论如何,执行此操作的标准方法是使用 let。

标签: clojure functional-programming conditional


【解决方案1】:

以下选项可能比您当前的选项更惯用和简洁。它避免重复调用block-with-several-function-calls-on-x 函数并使用when 来传达条件中缺少替代项的含义。

(defn block-with-several-function-calls-on-x [x]
  x)

(defn my-func [x] 
  (into (block-with-several-function-calls-on-x x)
        (when (contains? x :special-key)
          {:extra-key true})))

(my-func {:bla 1 :special-key 2})
;= {:bla 1, :special-key 2, :extra-key true}
(my-func {:bla 1})
;= {:bla 1}

【讨论】:

    【解决方案2】:

    cond->cond->>->->> 的条件版本,可能适合您的需要:

    (defn my-func
      [x]
      (cond-> (block-with-several-function-calls-on-x x)
        (contains? x :special-key) (assoc :extra-key true)
        (contains? x :other-key)   (dissoc :we-dont-need-this)))
    

    尽管只有一个条件,这可能不是可读性的缩影。

    【讨论】:

      【解决方案3】:

      尽管有你的建议,我还是会使用let

      (defn my-func [x]
        (let [ans (block-with-several-function-calls-on-x x)]
          (if (contains? x :special-key)
            (assoc ans :extra-key true)
            ans)))
      

      注意事项:

      • 您提到的唯一值是布尔值。如果所有你的价值观是 布尔值,使用集合,而不是地图。
      • 如果没有,我怀疑你的值是错误的(falsenil)。在 他们缺席,您可以将(contains? x :special-key) 替换为 (x :special-key)(:special-key x)

      【讨论】:

        猜你喜欢
        • 2015-05-07
        • 2010-09-18
        • 2014-08-27
        • 1970-01-01
        • 2017-02-18
        • 1970-01-01
        • 1970-01-01
        • 2012-06-28
        • 2012-10-24
        相关资源
        最近更新 更多