2017-10-11 16 views

回答

5

这两个示例empty?count函数是Clojure核心的一部分,它们的实现是由性能考虑驱动的,所以它们可能不是解决expression problem的最佳示例。总之:

  • 您可以通过实现Seqable接口使seq工作在你的类型,例如使empty?工作。
  • 您可以通过执行Counted界面使count工作。

示例代码:

(deftype Tuple [a b] 
    clojure.lang.Counted 
    (count [_] 2) 

    clojure.lang.Seqable 
    (seq [_] (list a b))) 

(count (->Tuple 1 2)) ;=> 2 
(empty? (->Tuple 1 2)) ;=> false 

一种新的功能更一般的解决办法是要么:

  • 为您创造功能的multimethod。现在您需要为受支持的类型编写自定义方法(通过defmethod)。
  • 创建一个protocol,其中包含您的功能并通过extend-protocolextend-type使这些类型满足协议。

无论哪种情况,您都可以随时为新或现有类型创建默认实现和新实现。即使在运行时!

+0

值得注意的是,你不能对'defrecord'类型做这个,它们应该是类似map的,并且带有不能替换的各种map接口的内置实现。要构建没有内置行为的自定义类型,您必须使用'deftype',就像这个答案一样。 – amalloy

相关问题