2013-01-22 17 views
6

Mam kilka klas Scala (takich jak Lift's Box, opcja Scala, itp.), Które chciałbym użyć w Clojure jako Clojure ISeq.Clojure ISeq z klas Scala

Jak mogę powiedzieć Clojure, jak zrobić te klasy w ISeq, tak aby wszystkie różne funkcje związane z sekwencją "tylko zadziałały" ?

Odpowiedz

2

Aby zbudować na odpowiedź Artura, można podać ogólną klasy otoki w Scala wzdłuż tych linii:

class WrapCollection(repr: TraversableOnce[_]) extends clojure.lang.Seqable { ... } 
2

Jeśli klasy implementują interfejs Iterable, można po prostu zadzwonić pod numer seq, aby uzyskać kolejność. Większość funkcji w bibliotece sekwencji zrobi to za ciebie, więc w prawie wszystkich normalnych przypadkach możesz po prostu przekazać je do funkcji seq, takich jak first i count.

+3

Pierwsza część to jest prawdziwe i dobre rady, ale absolutnie nie można przedłużyć Seqable do already- zdefiniowana klasa, ponieważ jest to interfejs, a nie protokół. – amalloy

+0

Czy nie jest tak tylko w przypadku 'java.lang.Iterable'? Kolekcje Scala (nie mówiąc już o 'Option' lub' Box') nie mieszają się (lub nie są przekształcane w niejawnie) 'scala.collection.TraversableOnce',' scala.collection.TraversableLike' i/lub ich podtrybów. –

+0

s/java.lang/java.util/w moim poprzednim komentarzu. :/ –

Powiązane problemy