请在2024 Clojure 调查问卷!中分享您的想法。

欢迎!请查看关于页面以了解更多关于该页面的信息。

0
ClojureScript

对于具有变长参数数量的定义函数:如果使用缺少的固定参数数量调用,它们将使用变长方法而不是出错;如果使用最大固定参数数量的固定参数调用,将调用变长方法而不是固定形式。

`
(defn f-hole
([a] 1)
([a b c d & args] "4 or more"))

(f-hole 1 2) ; =>"4 or more", 应该出错

(defn f-overlap-mfa
([a b] 2)
([a b & c] "2+"))

(f-overlap-mfa 1) ;=> "2+", 应该出错
(f-overlap-mfa 1 2) ;=> "2+", 应该是 2
(f-overlap-mfa 1 2 3) ;=> "2+", 正确
`

修复 f-hole 错误的一种方法是向开关语句中发出一个 "case X:",其中 X 没有签名或小于最大固定参数数量。

我不确定 f-overlap-mfa 发生的原因,并且没有深入研究。

3 个答案

0

评论者:favila

抱歉,针对 CLJ 而非 CLJS 提交的!

0

评论者:rohitaggarwal

我对于 {{f-overlap-mfa}} 观察到的行为是

(f-overlap-mfa 1) ;=> "2+" (f-overlap-mfa 1 2) ;=> 2 (f-overlap-mfa 1 2 3) ;=> "2+"

所以对于两个参数的结果与我不同,(链接: ~favila)。

但是,只有一个参数的调用会产生警告

{{WARNING: 用错数量 (1) 的参数传递给 cljs.user/f-overlap-mfa}}

0
参考:[CLJS-1678](https://clojure.atlassian.net/browse/CLJS-1678)(由favila报告)
...