可以查询clojure多方法的调度值吗?

Bra*_*rad 2 clojure

我正在写一些看起来像这样的代码:

(def
  authorized-access-levels
  {:sales-rep-manager (fn [{{user :user} :session}]

                        )
   :regional-sales-manager (fn [{{user :user} :session}]

                             )
   :vp-of-sales (fn [{{user :user} :session}]

                  )
   })
Run Code Online (Sandbox Code Playgroud)

稍后在代码中:

(defn
  get-my-housing
  [{{user :user} :session :as request}]
  (let [data-fn (authorized-access-levels (user :access-level))]
    (data-fn request)))
Run Code Online (Sandbox Code Playgroud)

在表面级别,这似乎是多方法的一个很好的用例,其中defmulti看起来像这样:

(defmulti get-my-housing (fn [{{{access-level :access-level} :user} :session}] access-level))
(defmethod get-my-housing :vp-of-sales [{{user :user} :session}]

  )
Run Code Online (Sandbox Code Playgroud)

但我有另一个需要,看起来像这样:

:auth-fn (fn [user] (contains? authorized-access-levels (user :access-level)))
Run Code Online (Sandbox Code Playgroud)

所以(长话短说)我需要键来确定用户是否有权获取数据,然后我使用密钥通过地图发送到函数.

我可以查询多方法以查看它的调度值是什么吗?如果是这样,那么我可以将其作为多方法编写,然后查询它以进行授权.还有其他想法吗?

Ale*_*lex 8

我可以查询多方法以查看它的调度值是什么吗?

是的,您可以使用methods函数对多方法进行内省,以获取多方法的调度表,并get-method查找给定调度值的方法.

user=> (defmulti authorized? :access-level)
user=> (defmethod authorized? :admin [_] true)
user=> (defmethod authorized? :user [_] false)

user=> (keys (methods authorized?))
(:user :admin)

user=> ((get-method authorized? :admin) {:access-level :admin})
true
Run Code Online (Sandbox Code Playgroud)