试图将java成员函数作为var传递

时间:2014-12-11 17:21:23

标签: clojure

如果我在REPL中运行以下代码

(let [f '.startsWith] (f "abab" "a"))

它被评估为" a"而不是' true'。有人可以解释一下这个令人惊讶的结果吗?

实际上,真正的代码,我想做的工作如下。

(defn set-up-bean! [bean functions-and-parameters]
  (doseq [[f p] functions-and-parameters]
    (f bean p))
  (.init bean))

我想要实现的是,使以下两个函数调用做同样的事情。

(set-up-bean! bean [['.setMember "a"]])

(do
  (.setMember bean "a")
  (.init bean))

1 个答案:

答案 0 :(得分:6)

一种传统方法是使用匿名函数

(let [f (fn [a b] (.startsWith ^String a ^String b))] (f "abab" "a"))

...因为这可以让你根据需要输入提示参数。您也可以考虑memfn

(let [f (memfn startsWith String)] (f "abab" "a"))

无论如何 - 点符号是互操作的语法糖,而不是提供真正的可调用函数。