请在 2024 Clojure 状态调查!中分享您的想法。

欢迎!请查阅关于页面以获取更多关于这个作品如何运作的信息。

+6
... Clojure
修改

为了文档书写原因而进行键解构是否是良好的样式?我之所以提问,是因为 clj-kondo,一个 Clojure 的 linter,会报告未使用的绑定。例如:

(let [x 1, y 2] y)

这会产生关于 x 未使用的警告。

有时人们这样做

(defn public-foo [{:keys [foo bar] :as x}]
  (private-baz x))

只是为了获得对 public-foo 的更好的 docstring(或生成文档)。但他们将会收到关于 foobar 未使用的警告。一个实际的例子:[链接](https://github.com/cljdoc/cljdoc/blob/d54cb58b20d2b4cb1e7c714b3637aa8b89956ce0/src/cljdoc/server/ingest.clj#L16)。

解构在性能上是有代价的,所以使用 spec 或 :arglists 可能是获得这些文档优点的一个更好的选择。例如:

user=>
(defn public-foo
  {:arglists '([{:keys [foo bar] :as x}])}
  [x]
  ;; (private-baz x)
  )
#'user/public-foo
user=> (doc public-foo)
-------------------------
user/public-foo
([{:keys [foo bar], :as x}])
nil

在我向 clj-kondo 添加抑制函数参数中键解构引起的未使用绑定警告之前的配置支持之前,我希望就这个问题达成共识。

6 个答案

+3
...

我不会只为文档而进行 :keys 解构;您提到的这些替代方案听起来都更好。我常常添加未使用的 :as 部分,但我相信这不会在性能上造成任何损失。

现在我有个问题...为什么不用像{:keys [foo bar]}这样的符号?我猜测这没有区别,但有时候,很多年前我就应该学到的细节,就像一个佩里·梅森时刻,突然显现,所以我必须问。

我们让关键字在那里工作只有一个原因,那就是为了得到自动解析关键字支持(::),但实际上现在大部分已经被具有:foo/keys 和 ::keys 取代了。所以,只要使用符号。
我在对一个以这种风格为主的代码库工作的时候养成了这个习惯,没有别的理由。
我一直在使用`{:keys [:some/namespaced-keyword :some/other-keyword]}`,主要为了更容易找到用法——也就是说,通过`:some/namespaced-keyword`进行grep搜索将找到完整版本,但不会找到`{:some/keys [namespaced-keyword]}`。这是否会被反对?
不,绝对没问题。
0 投票

在那种情况下,我的风格通常是

(defn public-foo [{:keys [foo bar] :as x}]
  (->> (private-baz foo bar)
    (assoc x :res)))
0 投票

我在文档中从不为了arglists而进行解构。

在:keys中使用关键字而不是符号是非常粗陋的。

0 投票

我经常在fn声明中解构,以明确自己的使用。我理解这种做法会使lint检查更加困难,但我会说这是人们会做的事情,一个可以关闭lint检查通知的控件会是一个很好的功能。

0 投票

我会表示认罪,但我不认为这是好的实践

0 投票

我这样做,我喜欢,但这只是个人观点,并没有对错之分。

好的风格很大程度上取决于观赏者。小心那些对这种琐碎事情发表强烈观点的人。

...