私は最近、インターフェイスとプロトコルが clojure で不完全に実装される理由を尋ねました。
user=> (defprotocol P (foo [self]))
P
user=> (extend-type Long P)
nil
user=> (extends? P Long)
true
user=> (foo 1)
IllegalArgumentException No implementation of method: :foo of protocol: #'user/P found for class: java.lang.Long clojure.core/-cache-protocol-fn (core_deftype.clj:527)
これは相互運用上の理由によるものであり、実際には問題にならないと言われました。もちろん。
しかし、明らかextends?
に、プロトコルとクラスの関係については何も教えてくれません:クラス C のオブジェクトを(extends? P C)
呼び出すことができることを意味しないのと同様に、クラス C のオブジェクトを呼び出すことができないことを意味するものでもありません。foo
(not (extends? P C))
foo
user=> (defprotocol P (foo [self]))
P
user=> (extend-type Object P (foo [self] 1))
nil
user=> (extends? P Long)
false
user=> (foo 1)
1
今、私はどのような情報extends?
が私に与えられるべきかについて非常に混乱しています... satisfies?
一方、2番目のケースは正しく処理しますが、最初のケースは処理しません。