gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 08:15:13 25 4
gpt4 key购买 nike

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

(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}]

)
})

后面的代码:

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

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

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

)

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

:auth-fn (fn [user] (contains? authorized-access-levels (user :access-level)))

所以(长话短说)我需要 key 来确定用户是否有权获取数据,然后我使用 key 通过映射分配给函数。

我可以查询一个多方法来查看它的调度值是什么吗?如果是这样,那么我可以将其编写为多方法,然后查询它以获得授权。还有其他想法吗?

最佳答案

Can I query a multimethod to see what it's dispatch values are?

是的,您可以使用 methods 函数对多方法进行自省(introspection),以获取多方法的调度表,并使用 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

关于clojure - 可以查询 clojure 多方法的调度值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28995474/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com