gpt4 book ai didi

Clojure - 命名参数

转载 作者:行者123 更新时间:2023-12-02 06:34:18 25 4
gpt4 key购买 nike

Clojure 有命名参数吗?如果是这样,您能提供一个小例子吗?

最佳答案

在 Clojure 1.2 中,您可以解构 rest 参数,就像解构映射一样。这意味着您可以执行命名的非位置关键字参数。这是一个例子:

user> (defn blah [& {:keys [key1 key2 key3]}] (str key1 key2 key3))
#'user/blah
user> (blah :key1 "Hai" :key2 " there" :key3 10)
"Hai there10"
user> (blah :key1 "Hai" :key2 " there")
"Hai there"
user> (defn blah [& {:keys [key1 key2 key3] :as everything}] everything)
#'user/blah
user> (blah :key1 "Hai" :key2 " there")
{:key2 " there", :key1 "Hai"}

在解构 Clojure 映射时可以执行的任何操作都可以在函数的参数列表中完成,如上所示。包括使用 :or 定义参数的默认值,如下所示:

user> (defn blah [& {:keys [key1 key2 key3] :or {key3 10}}] (str key1 key2 key3))
#'user/blah
user> (blah :key1 "Hai" :key2 " there")
"Hai there10"

但这是在 Clojure 1.2 中。或者,在旧版本中,您可以执行此操作来模拟相同的事情:

user> (defn blah [& rest] (let [{:keys [key1 key2 key3] :or {key3 10}} (apply hash-map rest)] (str key1 key2 key3)))
#'user/blah
user> (blah :key1 "Hai" :key2 " there")
"Hai there10"

一般情况下,其工作原理是相同的。

您还可以在关键字参数之前添加位置参数:

user> (defn blah [x y & {:keys [key1 key2 key3] :or {key3 10}}] (str x y key1 key2 key3))
#'user/blah
user> (blah "x" "Y" :key1 "Hai" :key2 " there")
"xYHai there10"

这些不是可选的,必须提供。

您实际上可以像解构任何 Clojure 集合一样解构 rest 参数。

user> (defn blah [& [one two & more]] (str one two "and the rest: " more))
#'user/blah
user> (blah 1 2 "ressssssst")
"12and the rest: (\"ressssssst\")"

即使在 Clojure 1.1 中您也可以执行此类操作。不过,关键字参数的映射式解构仅出现在 1.2 中。

关于Clojure - 命名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3337888/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com