Clojure:为列表和字符串做点什么

时间:2013-09-21 22:31:29

标签: clojure

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

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

1 个答案:

答案 0 :(得分:3)

只有协议功能的类型提示很重要;方法实现中的类型提示没有任何意义。严格地说,编译器将使用附加到Vars保持函数的类型提示。这里讨论的var - #'url-encode - 由defprotocol表单(以及#'IUrlEncodable创建,其中包含一些协议管理员和相关的JVM接口)。附加到url-encode方法名称的元数据将传输到此Var。附加到符号中的元数据,在调用extend&公司没有相关性。

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