如何找到需要为协议接口定义的功能

时间:2012-09-11 01:44:28

标签: clojure

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

类似地,如果我看到一个界面,例如。 clojure.lang.ILookup如何找出需要实施的方法?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

首先,从这里克隆源:( git)https://github.com/clojure/clojure.git(浏览器)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中工作here

回到包含?但是,您可以使用记录来实现您想要的效果。

e.g。

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