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

欢迎!有关此如何工作的更多信息,请参阅关于 页面。

+6
Clojure
编辑

出于文档原因进行键解构是良好的风格吗?我之所以提问,是因为 clj-kondo(Clojure 的代码检查工具)报告了未使用的绑定。例如:

(let [x 1, y 2] y)

导致这样的警告:关于 x 未使用。

有时人们这样做

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

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

在性能方面,解构并非无偿(rel="nofollow" href="https://github.com/candid82/joker/issues/240#issuecomment-509026070" target="_blank"),因此使用 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]}`,主要是不容易找到使用的情况。也就是说,使用`grepping for :some/namespaced-keyword`会找到完整的版本,但不会找到`{:some/keys [namespaced-keyword]}`。这样做有问题吗?
没有,完全没问题。
0
by

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

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

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

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

0
by

我经常在函数声明中使用解构来明确自己的用法。我理解这种做法会使代码检查更加困难,但我觉得这是人们常用的一种方法,如果能有一个开关来关闭对此类代码检查的通知那就更好了。

0
by

我会承认,但我不认为这是良好的做法

0

我做这件事,我喜欢它,但这只是个人观点,没有对错。

好的风格很大程度上取决于个人看法。当心那些对这类小事有强烈观点的人。

...