请在 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

我从不为了文档目的而分解:keys;你提到的替代方案听起来都很好。我确实经常添加:as部分,即使不使用它,但我相信这并不会带来性能惩罚。

现在,我有一个自己的问题...你为什么不使用符号,比如{:keys [foo bar]}?我觉得这应该没有区别,但我猜小时候的一些小事就像佩里·梅森时刻一样突然出现,所以我还是得问问。

我们之所以让关键字在那里起作用,是为了获得自动解析关键字支持(::),但实际上这已经被现在有: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

我经常在函数声明中使用解构来澄清我的用法。我明白这种做法使linting变得困难,但我认为这是人们会做的事情,有一个可以关闭linting通知的旋钮将是不错的选择。

0

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

0
by

我做这样的事情,我喜欢它,但是这只是个人观点,而且这里没有对错之分。

好的风格很大程度上是看个人的。小心那些对这种琐事发表强烈观点的人。

...