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 文档字符串(或生成的文档)。但他们将得到关于 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
by

我从不出于文档的目的对 :keys 进行解构;您提到的替代方案听起来都更好。我经常添加 :as 部分,即使不使用它,我也相信这种情况没有性能损失。

现在我有个问题……为什么不用符号,比如{:keys [foo bar]}?我猜差别不大,但有时候,一些我应该在几年前就学会的小事情,会像佩里·梅森时刻那样显现出来,所以我必须问问。

我们之所以让关键字在那边工作,是因为为了得到自动解析关键字支持(::),但是现在 mostly 已被现在有 :foo/keys 和 ::keys 取代。所以,只需使用符号。
我在从事一个以这种风格为主的代码库工作时养成了这个习惯,没有其他原因。
我一直在使用`{:keys [:some/namespaced-keyword :some/other-keyword]}`,主要是为了便于查找使用 - 即用`grep`搜索`:some/namespaced-keyword`将找到完整版本,但不会找到`{:some/keys [namespaced-keyword]}`。这样做被认为是不好的吗?
不,完全没问题。
0 投票

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

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

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

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

0 投票

我经常在函数声明中使用解构来明确自我使用。我理解这种做法会使配线更加困难,但我会说这是一种人们会做的事情,并且一个可以关闭针对此的通知的旋钮将会很好。

0 投票

我认罪,但我不认为这是好习惯。

0 投票

我做这件事,我喜欢,但这是一个观点,这里没有对错之分。

好的风格很大程度上取决于观赏者的观点。当心那些对这类琐事表示强烈观点的人。

...