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 に答える