将Java对象方法调用结果转换为Clojure映射

3

我刚接触Clojure,创建了一个简单的宏来调用Java类中的某些方法,并将结果返回到Clojure映射中,这一切都很好运行。(我也知道bean函数,但我使用的类不是bean。)

我的问题是关于调用代码的。传递Java“方法”作为符号是否更好?

我甚至不确定现在(在调用代码中).toString是什么类型?它可以工作,但不确定它是否符合Clojure惯用法。

(defmacro obj-to-map 
  [obj & body]
  (let [afn (fn [[method kw]]
              `(~kw (~method ~obj)))]
  `(assoc {} ~@(mapcat afn (partition 2 body)))))

(obj-to-map "hello" .length :length .toString :value)  

=>  {:value "hello", :length 5}

也许 https://github.com/ngrunwald/gavagai 也会有所帮助。 - georgek
是的,我看过这个项目,但它可能对我所需的东西来说有些过度了。有时候自己解决问题也很有趣! - tgrrr
2个回答

2
< p > .toString等是调用代码中的符号。

我认为更好的方法是传递方法名并使用“.”来调用它。

(defmacro obj-to-map 
  [obj & body]
  (let [afn (fn [[method kw]]
              `(~kw (. ~obj ~method)))]
  `(assoc {} ~@(mapcat afn (partition 2 body)))))

(obj-to-map "hello" length :length toString :value)  

=>  {:value "hello", :length 5}

你说得对,那看起来好多了。"http://clojure.org/java_interop#Java Interop-The Dot special form" - tgrrr

0
作为一种选择,考虑在不使用宏的情况下解决这个问题。宏仍然会隐式地使用反射,在这里只需要应用 clojure.lang.Reflector/invokeInstanceMethod 即可。
基本实现是 obj-to-map,然后是对变参进行简单修改。
; just a reusable object for calling no-arg methods
(def empty_array (into-array Object []))

; function update-vals available since v1.11.50
(defn obj-to-map [obj methods]
  (update-vals methods
               #(clojure.lang.Reflector/invokeInstanceMethod
                  obj % empty_array)))

(defn obj-to-map2 [obj & methods]
  (obj-to-map obj (apply hash-map methods)))

(defn obj-to-map3 [obj & methods]
  (obj-to-map obj (into {} (for [k methods] [(keyword k) k]))))
    
(defn obj-to-map4 [obj & methods]
  (obj-to-map obj (into {} (for [k methods] [(keyword k) (str k)]))))

; usage

(obj-to-map "hello" {:len "length" :st "toString"})     ; => {:len 5, :st hello}

(obj-to-map2 "hello" :len "length" :st "toString")      ; => {:st hello, :len 5}

(obj-to-map3 "hello" "length" "toString")               ; => {:length 5, :toString hello}

(obj-to-map4 "hello" 'length 'toString)                 ; => {:length 5, :toString hello}

文档:update-vals


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接