2

如果我希望我的类型实现一个功能,例如。contains?如何找出要扩展的接口?

同样,如果我看到一个界面,例如。clojure.lang.ILookup如何找出需要实施哪些方法?

4

2 回答 2

1

如果您想查看接口需要哪些方法(包括继承的成员),请在 repl 中使用 java 反射:

 (clojure.pprint/pprint (.getMethods clojure.lang.ILookup))
 [#<Method public abstract java.lang.Object clojure.lang.ILookup.valAt(java.lang.Object)>,
  #<Method public abstract java.lang.Object clojure.lang.ILookup.valAt(java.lang.Object,java.lang.Object)>]

如果您使用 Clojure 1.2,您还可以使用clojure.contrib.repl-utils/show

于 2012-09-11T14:31:17.917 回答
0

首先,从这里克隆源代码:(git) https://github.com/clojure/clojure.git (browser) https://github.com/clojure/clojure

查看包含的来源?在 src/clj/clojure/core.clj 中,它转身调用 clojure.lang.RT.contains。

该文件位于 src/jvm/clojure/lang/RT.java 中,您可以看到它可以与 Associate、IPersistentSet、Map、Set 的实例一起使用,而且它看起来也可以索引到数组和字符串中,所以选择什么对你的情况有意义。

同样,ILookup 的源代码位于同一目录中。如果您不熟悉接口,可以在此处了解接口如何在 Java 中工作。

返回包含?但是,您也许可以使用记录来实现您想要的。

例如

main=> (defrecord Action [time key args state])
main.Action
main=> (def action (Action. (System/currentTimeMillis) "key" ["arg1" "arg2"] nil))
#'warscor.main/action
warscor.main=> (contains? action :time)
true
warscor.main=> (contains? action :state)
true
warscor.main=> (contains? action :foo)  
false
warscor.main=> (def action (assoc action :foo "bar"))
#'warscor.main/action
warscor.main=> (contains? action :foo)               
true
于 2012-09-11T02:10:10.960 回答