上下文:让我们创建一个百分比编码器。因此,字符将被编码为他们的%表示。此外,我希望字符串的矢量将编码如下:[a b] -> (str (encode a) "+" (encode b))
。背后的原因是我希望将空格编码为%20
以获取字符串和使用+
标记的字符串列表。我用协议做了这个:
(defprotocol IUrlEncodable
(^String url-encode [v]))
(extend-protocol IUrlEncodable
String
;; Do I need type here? I have it in the protocol.
(^String url-encode [v]
(-> v URLEncoder/encode (.replace "+" "%20")))
IPersistentVector
;; Same question here.
(^String url-encode [v]
(->> v (map url-encode) (join "+"))))
这是一种规范的方式吗?我做对了吗?什么是替代品?如果我已在协议中声明它,我是否需要在协议扩展中重新声明类型提示?
答案 0 :(得分:3)
只有协议功能的类型提示很重要;方法实现中的类型提示没有任何意义。严格地说,编译器将使用附加到Vars保持函数的类型提示。这里讨论的var - #'url-encode
- 由defprotocol
表单(以及#'IUrlEncodable
创建,其中包含一些协议管理员和相关的JVM接口)。附加到url-encode
方法名称的元数据将传输到此Var。附加到符号中的元数据,在调用extend
&公司没有相关性。
请注意,从技术上讲,您根本不需要任何类型提示,但如果您确实将它们放入,它们可能有助于编译器在某些情况下避免反射。