在 clojure 中实现协议时,为什么会出现“不支持的绑定形式”错误?

Sea*_*etz 5 jvm clojure

我正在尝试在我正在编写的 clojure 程序中实现带有记录的协议。我得到的错误是“不支持的绑定形式”。

    (defprotocol query-rows
        (query-text [table])
        (trans-cols [table rows])
        (set-max [table] [table id]))


    (defrecord Submissions [data max-id]
        query-rows
        (query-text [table] 
            (gen-query-text "SubmissionId" "Valid" "Submission"))
        (trans-cols [table rows]
            (let 
                [trans-data 
                    (->>
                        rows
                        (trans-col #(if % 1 0) :valid :valid_count)
                        (trans-col #(if % 0 1) :valid :non_valid_count)
                        (trans-col format-sql-date :createdon :date))]
                (assoc table :data trans-data)))
        (set-max 
            ([table]
                (when-let [id (gen-get-max "SubmissionAgg2")]
                (assoc table :max-id id)))
            ([table id] (assoc table :max-id id))))
Run Code Online (Sandbox Code Playgroud)

“set-max”函数是引发错误的原因。我有一种感觉,我试图错误地使用多个 arity。有谁知道我做错了什么?

A. *_*ebb 5

您已正确诊断问题。您需要遵循http://clojure.org/protocols 上的示例,并在 defrecord 的正文中分别定义 set-max 方法的多个参数。

...
(set-max [table] ...)
(set-max [table id] ...)
...
Run Code Online (Sandbox Code Playgroud)