Clojure、Java Interop 和代理方法

标签 clojure interop

所以,假设我有一个名为 MyFunction 的 Java 抽象类,它有一个抽象评估方法。

要在 clojure 中使用它,我可以这样做:

(def java-function
 (proxy [MyJavaFunction] []
   (evaluate [x]
     (* x 2))))

然后用以下方式调用它:

 (.evaluate java-function 3)

返回

 ; => 6

将上述内容转变为更 clojure 的东西有什么好方法:

  (java-function 3)

这也会返回

 ; => 6

最佳答案

您可以通过实现 clojure.lang.IFn 接口(interface)来实现这一点:

((proxy [clojure.lang.IFn] []
  (invoke [x]
    (str "A very a nice x indeed: " x)))
 3)
;= "A very a nice x indeed: 3"

要让您的代理子类 MyFunction 并实现 IFn,请在 proxy 的第一个参数中提及它们;注意。类先行:

(proxy [MyFunction clojure.lang.IFn] []
  ...)

实际上,上面的实现并不完整 - 您还需要实现 applyTo 方法,该方法除了 this 之外还采用单个 seq 参数,并由 使用应用。对于其他固定数量(最多 20 个),还有单独的invoke 方法。关注 this link查看 data.avl 的源代码(版本 0.0.12)以查看委托(delegate)给适当的 invoke 方法的 applyTo 实现,同时注意避免进入无限循环/采取过度的操作如果传入的 seq 恰好是无限/非常长的时间量。

关于Clojure、Java Interop 和代理方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25619698/

相关文章:

c# - 为混合代码 DLL 中_caught_ SEH 异常生成小型转储

wcf - 开发可互操作的 WCF Web 服务时我应该知道什么?

clojure - Clojure 的懒惰评估发生了什么

clojure - 解析 let 中的符号

clojure - 了解多方法调度

c++ - 无法使用 Bonjour SDK 设置 TXTRecord(COM Wrapper to CComObject< CTXTRecord >*)

java - 范围类 : java interoperability

.net - 使用 __declspec(thread) 的线程本地存储在 C++/CLI 中失败

clojure - 为什么 Clojure 的 `let` 和 `for` 都是单子(monad)?

clojure - 在 Clojure 中定义匿名函数时出错