我对Clojure来说相对较新,所以我无法理解如何进行以下工作。
从Java方法(从反射包)开始,我想提取各种属性,最后得到如下所示的地图:
{ :name "test-method
:return-type "String"
:public true
}
由于构建键的逻辑可能相当复杂,我想链接一系列采用当前映射和方法对象的函数,并修改映射或按原样返回。类似的东西:
(defn build-public
[acc method]
(if (is-public? method) (assoc acc :public true) acc))
可能会被称为:
(make-method-map method [build-public build-return-type build-name])
我尝试了几种不同的方法,但似乎无法使其发挥作用,我们将非常感谢任何建议。
答案 0 :(得分:2)
简单的方法是使用reduce:
逐个应用每个函数user> (defn make-method-map [method fns]
(reduce (fn [acc f] (f acc method))
{} fns))
#'user/make-method-map-2
user> (defn make-name [acc method]
(assoc acc :name 123))
#'user/make-name
user> (defn make-other [acc method]
(assoc acc :something "ok"))
#'user/make-other
user> (make-method-map {:a 1 :b 2} [make-name make-other])
;;=> {:name 123, :something "ok"}
答案 1 :(得分:0)
执行此操作的一种方法是cond->
,它结合了cond
和->
的概念。
(cond-> {:my-map 1}
(= 2 2) (assoc :two-equals-two true)
(= true false) (assoc :not-possible "hey"))
=> {:my-map 1, :two-equals-two true}
左边的子句确定是否评估右侧的表格,初始值穿过第一个位置。
答案 2 :(得分:0)
我会写(defn method-map [method]
(-> {}
(assoc :return-type (get-return-type method))
(assoc :name (get-name method))
(cond-> (public? method) (assoc :public? true))))
这样的东西:
cond->
请注意您如何在as->
内嵌套->>
(或->
或->>
)。但是,将它们中的任何一个放在(defn method-map [method]
(-> {}
(assoc :return-type (get-return-type method))
(assoc :name (get-name method))
(assoc :public? (public? method))))
或类似内容中可能不会像您期望的那样有效。
为什么这是留给读者的练习。
其实我会写这样的东西:
(defn method-map [method]
{:return-type (get-return-type method)
:name (get-name method)
:public? (public? method)})
或者使用文字地图,如果我可以逃脱它(一步不依赖于下一个,等等)
cond->
但是这并没有显示嵌套session.query(TABLE).filter(TABLE.QueryTimestamp.in_(ts_list)).count()
的技巧。
如果你发现自己有一个函数向量,那么leetwinski的回答是好的。就像编程中的一切一样,它取决于它。
答案 3 :(得分:0)
我喜欢(defn make-name [method] {:name (str (:a method) "-" (:b method))})
(defn make-other [method] {:a-is-3 (= (:a method) 3)})
(defn make-method-map [method fns]
(into {} ((apply juxt fns) method)))
(defn make-method-map [method fns]
(reduce merge ((apply juxt fns) method)))
(defn make-method-map [method fns]
(apply merge ((apply juxt fns) method)))
(make-method-map {:a 1 :b 2} [make-name make-other])
; {:name "1-2", :a-is-3 false}
选项,但这里有一个不同的功能签名替代方案:
acc
juxt返回函数返回值的向量,此处into
不作为输入参数,而是reduce
或comp
用于“合并”这些哈希映射到最终结果。最初我想过使用http://edition.cnn.com/data/ocs/section/politics/index.html
,但这些函数的风格并不是“可组合的”。