首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >能否查询clojure multimethod的分派值?

能否查询clojure multimethod的分派值?
EN

Stack Overflow用户
提问于 2015-03-11 19:18:43
回答 2查看 921关注 0票数 3

我正在编写一些代码,如下所示:

代码语言:javascript
复制
(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}]

                  )
   })

稍后在代码中:

代码语言:javascript
复制
(defn
  get-my-housing
  [{{user :user} :session :as request}]
  (let [data-fn (authorized-access-levels (user :access-level))]
    (data-fn request)))

在表面级别上,这似乎是多方法的一个很好的用例,defmulti看起来如下所示:

代码语言:javascript
复制
(defmulti get-my-housing (fn [{{{access-level :access-level} :user} :session}] access-level))
(defmethod get-my-housing :vp-of-sales [{{user :user} :session}]

  )

但我还有另一个需要是这样的:

代码语言:javascript
复制
:auth-fn (fn [user] (contains? authorized-access-levels (user :access-level)))

因此(长话短说)我需要这些键来确定用户是否被授权获取数据,然后我使用密钥通过地图向函数分派。

我可以查询multimethod来查看它的分派值吗?如果是这样的话,那么我可以将它写成一个multimethod,然后查询它以获得授权。还有其他想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-12 13:28:58

我可以查询multimethod来查看它的分派值吗?

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

代码语言:javascript
复制
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
票数 9
EN

Stack Overflow用户

发布于 2015-03-12 09:11:54

我不确定我的理解是否正确,但让我试试。我们要将三个不同的概念建模为三个不同的函数:获取用户访问级别,从访问级别获得用户授权,最后获得住房。我会这样做:

代码语言:javascript
复制
(defn get-access-level [user]
  (:access-level user))

(defn authorized? [user]
  (contains? authorized-access-levels (get-access-level user)))

(defmulti get-my-housing (fn [req] 
                           (get-access-level (get-in req [:session :user]))

(defmethod get-my-housing :vp-of-sales
  [req]
  ((:vp-of-sales authorized-access-levels) req))

如果每个defmethod有不同的行为,这是值得的。如果他们都用不同的键访问同一张地图,那么额外的间接可能是不值得的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28995474

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档