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

欢迎!请参阅 关于 页面以了解更多关于这种方式的信息。

+6
Clojure
编辑

为了文档说明的目的,对 keys 进行解构是否是良好的风格?我之所以询问这个问题,是因为 clj-kondo,Clojure 的一个代码检查器,报告了未使用绑定。例如:

(let [x 1, y 2] y)

结果产生关于 x 未使用的警告。

有时人们这么做

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

只是为了得到更好的对 public-foo 的文档字符串(或生成的文档)。但他们将得到关于 foobar 未使用的警告。一个例子:在 GitHub 上的 链接

在性能方面,解构并不是免费的,因此,使用 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 添加任何配置支持以抑制由 keys 解构在函数参数中引入的未使用绑定产生的警告之前,我希望在这方面达成共识。

6 答案

+3

我从未只是为了文档解构 :keys;你提到的方案听起来都更好。我经常添加没有使用的 :as 部分,但我在这种情况下肯定没有性能惩罚。

现在我有了一个自己的问题...为什么你没有使用符号,比如 {:keys [foo bar]} 呢?我猜这之间没有差别,但是有时候一些多年前就应该学会的小事情突然显现出来,就像佩里·梅森时刻一样,所以我必须问问。

by
我们在那里让关键字工作是为了获取自动解析关键字支持(::),但实际上这已经基本被:foo/keys 和 ::keys 所取代。所以,就使用符号吧。
by
我在处理那个流行的这种风格的代码库时养成了这个习惯,没有其他原因。
by
哦,我一直在用 `{:keys [:some/namespaced-keyword :some/other-keyword]}`,主要是因为这样更容易找到用法——即使用 `:some/namespaced-keyword` 进行grep可以找到完整版本,但不能找到 `{:some/keys [namespaced-keyword]}`。这样做是不被看好吗?
by
没有,完全没问题。
0 投票
by

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

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

我从未为了文档中的参数列表而解构

在 :keys 中使用关键字而不是符号是很糟糕的

0 投票

0 投票

我会承认我的错误,但我不认为这是好习惯。

0 投票

我做这个,我喜欢它,但这只是我的看法,并没有对错之分。

好的风格很大程度上取决于个人喜好。警惕那些对这种小事有强烈看法的人。

...