2011-11-28 19 views
44

Digamos que tengo una secuencia de cadenas como entrada y quiero obtener un nuevo Seq inmóvil que consta de elementos de la entrada y un elemento "c". Aquí hay dos métodos que he descubierto estar funcionando:Agregar un elemento a una Secuencia inmutable

  1. assert(Seq("a", "b", "c") == Seq("a", "b") ++ Seq("c")) - el problema con esto es que parece que crear instancias de una secuencia temporal (Seq("c")) sólo por el bien de la operación es rendundant y resultará en overhead
  2. assert(Seq("a", "b", "c") == List("a", "b") ::: "c" :: Nil) - este restringe el tipo de colección de entrada para que sea List, por lo que Seq("a", "b") ::: "c" :: Nil no funcionará. También parece que puede crear instancias de un Nil aswell resultado de sobrecarga

Mis preguntas son:

  1. ¿Hay alguna otra forma de realizar esta operación?
  2. ¿Cuál es mejor?
  3. ¿No está permitido el Seq("a", "b") ::: Nil una falla de los desarrolladores de Scala?
+0

Véase también http://stackoverflow.com/q/6559996/770361 para ':::' equivalent en non-Lists –

Respuesta

88

Uso del (agregar) operador :+ a anexar un elemento a un Seq:

Seq("a", "b") :+ "c" 

Tenga en cuenta que algunas implementaciones de Seq son más adecuados para anexar que otros. List está optimizado para anteponer. Vector tiene operaciones rápidas de agregar y anteponer.

::: es un método en el que List requiere otro List como parámetro - ¿cuáles son las ventajas que se ven en ella aceptar otros tipos de secuencia? Tendría que convertir otros tipos a List. Si sabe que List es eficiente para su caso de uso, entonces use ::: (si es necesario). Si desea un comportamiento polimórfico, utilice el genérico ++.

No hay una sobrecarga de creación de instancias para usar Nil; no lo instancias porque es un singleton.

Cuestiones relacionadas