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 未使用的警告。野外的例子:链接

解构在性能方面并不是免费的,因此使用 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]}`相当频繁,主要是为了便于查找用法 - 例如 use grep for `:some/namespaced-keyword`会找到完整版本,但不会找到`{:some/keys [namespaced-keyword]}`。这是不是会受到谴责?
不是,完全没有问题。
0 投票

我在那种情况下通常会这样去解决

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

我不会仅为了文档中的参数列表进行解构。

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

0 投票

我经常在 fn 声明中解构以清晰地说明自己的用法。我明白这种做法会使 lint 难以执行,但我觉得这是人们会做的事情,并为这种情况关闭 lint 通知将是一种不错的功能。

0 投票

我承认这样做是不正确的,但我认为这不是一个好的做法。

0 投票

我做这个,我喜欢,但这只是一个观点,这里没有对或错。

好的风格很大程度上取决于观者的感受。警惕那些对于这类微不足道的事情提出强烈观点的人。

...