如果我希望我的类型实现一个功能,例如。 contains?
如何找出要扩展的接口?
类似地,如果我看到一个界面,例如。 clojure.lang.ILookup
如何找出需要实施的方法?
答案 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