【发布时间】:2013-01-22 22:30:56
【问题描述】:
我有一堆我想要的 Scala 类(如 Lift's Box、Scala's Option 等) 在 Clojure 中用作 Clojure ISeq。
我如何告诉 Clojure 如何将这些类变成一个 ISeq,以便所有各种序列 相关功能“正常工作”?
【问题讨论】:
我有一堆我想要的 Scala 类(如 Lift's Box、Scala's Option 等) 在 Clojure 中用作 Clojure ISeq。
我如何告诉 Clojure 如何将这些类变成一个 ISeq,以便所有各种序列 相关功能“正常工作”?
【问题讨论】:
要基于 Arthur 的回答,您可以按照以下思路在 Scala 中提供一个通用包装类:
class WrapCollection(repr: TraversableOnce[_]) extends clojure.lang.Seqable { ... }
【讨论】:
如果类实现了Iterable 接口,那么您只需在它们上调用seq 即可获得序列。序列库中的大多数函数都会为您执行此操作,因此在几乎所有正常情况下,您可以将它们按原样传递给像 first 和 count 这样的 seq 函数。
【讨论】:
java.lang.Iterable的情况吗? Scala 集合(更不用说 Option 或 Box)不会,而是混合(或隐式转换为)scala.collection.TraversableOnce、scala.collection.TraversableLike 和/或其子特征。