2024年Clojure状态调查!中分享你的想法。

欢迎!请查看关于页面以了解此功能的更多信息。

+1
协议

我在REPL中玩协议时遇到了以下情况

(defprotocol IGreeter
  (greet [this]))

(deftype MyGreeter []
  IGreeter
  (greet [_] "hi from MyGreeter"))

(extends? IGreeter MyGreeter)
;=> true

 ;; I expected to see MyGreeter listed here, but result is nil
(extenders IGreeter)
;=> nil

将协议扩展到几个类型。

(extend-protocol IGreeter 
  String 
  (greet [this] "hi-string")
  clojure.lang.Symbol 
  (greet [this] 'hi-sym)  ; ' help syntax highlighter
  clojure.lang.Keyword
  (greet [this] :hi-kw))

(extenders IGreeter)
;=> (java.lang.String clojure.lang.Symbol clojure.lang.Keyword)

String、Symbol和Keyword出现在IGreeter的扩展器中。MyGreeter没有出现。这特别令人惊讶,因为(exists? IGreeter MyGreeter)返回true。我是理解错了,还是可能是一个bug?谢谢!

1 答案

+1

被选中
 
最佳答案

这符合extenders函数的文档字符串 - "返回显式扩展协议的类型集合",我认为这里的“显式扩展”指的是通过extend-type、extend-protocol或extend扩展的类型。扩展的三种机制有时被称为“外部”(或“显式”)、“直接”(deftype / defrecord / reify)和“元数据”,请参阅https://clojure.org/reference/protocols

所以,这不是一个bug。

啊,我现在明白了。感谢您的解释。我非常感激有Clojure Q&A可以就这样的问题发问,以及您在创建一个出色的Clojure社区中的具体作用。
...