“Clojure”的方式是什么;在……时做额外的事情。”;
我有一个函数““Clojure”的方式是什么;在……时做额外的事情。”;,clojure,functional-programming,conditional,Clojure,Functional Programming,Conditional,我有一个函数“myfunc”,它处理作为参数获取的映射x,并返回映射。处理过程相当长,因此我在这里将其转移到函数block-with-multi-function-calls-on-x 如果传入映射包含:特殊密钥,则应向传出映射添加额外的键值对 (defn my-func [x] (if (contains? x :special-key) (assoc (block-with-several-function-calls-on-x x) :extra-key
myfunc
”,它处理作为参数获取的映射x
,并返回映射。处理过程相当长,因此我在这里将其转移到函数block-with-multi-function-calls-on-x
如果传入映射包含:特殊密钥
,则应向传出映射添加额外的键值对
(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-multi-function-calls-on-x
的代码保留在my func
中。如果使用其他编程语言,我只需将该部分的输出保存在一个变量中,然后(如有必要)添加附加部分,然后返回值。有人告诉我,使用let
不是“Clojureque”
那么,将代码传输到函数(正如我上面所做的)是唯一的方法吗?或者a是否为第二个块的输出添加了附加内容
-功能:
(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)))
以下选项可能比您当前的选项更为惯用和简洁。它避免了重复调用
block-with-multi-function-calls-on-x
函数,并在时使用来传达条件语句中缺少替代项的含义
(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}
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)))
尽管只有一个条件,这可能不是可读性的缩影。尽管你有建议,我还是使用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)))
注:
- 您提到的唯一值是布尔值。如果你所有的价值观
布尔值,使用集合,而不是映射
- 如果没有,我怀疑您是否有false(
false
或nil
)值。在里面
如果它们不存在,您可以将(包含?x:特殊键)
替换为
(x:特殊键)
或(:特殊键x)
李>
“使用let不是Clojureque”——这是荒谬可笑的错误,说它的人对Clojureperhaps了解不多——有一些沟通错误?例如,let不创建“变量”。无论如何,实现这一点的标准方法是使用let。