请在 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 并未显示。这特别令人惊讶,因为 (extends? IGreeter MyGreeter) 返回 true。我是不是理解错了,或者是 bug 吗?谢谢!

1 答案

+1

选定答案
 
最佳答案

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

所以,这不是 bug。

by
啊,我现在明白了区分。感谢您的澄清。我很欣赏有Clojure问答社区来提问这类问题,并感谢您在构建伟大的Clojure社区中的具体作用。
...