1

上下文:让我们创建一个百分比编码器。因此,字符将被编码为他们的 % 表示。另外,我希望字符串向量将像这样编码:[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 "+"))))

这是一种规范的方法吗?我做对了吗?什么是替代品?如果我在协议中声明了类型提示,是否需要在协议扩展中重新声明类型提示?

4

1 回答 1

3

只有协议函数的类型提示很重要;方法实现中的类型提示没有任何用途。严格来说,编译器将使用附加到 Vars 持有函数的类型提示。这里有问题的 var #'url-encode-- 是由defprotocol表单创建的(连同#'IUrlEncodable,它包含一些协议管理和相关的 JVM 接口)。附加到url-encode方法名称的元数据将传输到此 Var。在调用extend& Co. 时附加到命名此方法的符号的元数据没有相关性。

请注意,从技术上讲,您根本不需要任何类型提示,但如果您确实将它们放入,它们可能会帮助编译器在某些情况下避免反射。

于 2013-09-22T00:34:15.773 回答