2017-01-03 2 views
1

Я хочу создать новую коллекцию Scala из существующей коллекции Seq. У меня есть черта по имени реф, который содержит данные, как показано нижеСоздать пользовательскую коллекцию Seq в Scala

trait Ref[A] { 
    def get: A 
    def getAsOption: Option[A] 
    def dataType: Class[A] 
    // other methods 
} 

Моей пользовательской подборки Vec, который представляет собой последовательность из работы [A] (т.е. Vec [A] приравненные к последу [Ref [A]]), причина, по которой я хочу создать такую ​​коллекцию, как это, потому что я хочу сохранить параметр типа в коллекции Ref для обработки в пользовательских методах. Мой код ниже

trait VecLike[A, +Repr <: Seq[Ref[A]]] 
    extends SeqLike[Ref[A], Repr] 
    with TraversableLike[Ref[A], Repr] { 
// custom methods 
} 

trait GenVec[A] 
    extends VecLike[A, Seq[Ref[A]]] 
    with Seq[Ref[A]] 
    with PartialFunction[Int, Ref[A]] 

abstract class AbstractVec[A](vec: Ref[A]*) 
    extends AbstractSeq[Ref[A]] 
    with GenVec[A] {...} 

class Vec(vec: Ref[A]*) 
    extends AbstractVec[A](vec:_*) 
    with VecLike[A, Vec[A]] 
    with GenericTraversableTemplate[Ref[A], Seq] 

Но когда я называю карту функция()

Vec(1,2,3,4).map(intToString) 

Он возвращает Seq [String], ожидаемый результат Vec [String]. Я также попытался создать пользовательский CanBuildFrom в сопутствующем объекте с SeqFactory [Seq], но он не удался. :(:(

Может кто-нибудь дать мне несколько советов по этому поводу, и как я могу осуществить для достижения этой цели?

ответ

2

Вы должны реализовать пользовательские Builder и сделать newBuilder метод в VecLike вернуть его. Проверьте эту страницу для очень хороший учебник по реализации пользовательских коллекций: http://docs.scala-lang.org/overviews/core/architecture-of-scala-collections.html

+0

я собирался оценить автор этого комментария, а затем понял, что это от @Dima. Какое совпадение? О, это, лучший ответ на этот вопрос. –

0

я закончил, это моя ошибка, которую я создал неправильно CanBuildFrom Ниже в полном объеме с CanBuildFrom (CBF Вдохновленный от Scala GenericCanBuildFrom)

.

Теперь я могу получить Vec результат вместо последа после отображения вызова функции() как показано ниже

val vec = Vec(1,2,3,4) 
var vecStr : Vec[String] = vec.map(intToString) 
Смежные вопросы