2010-06-30 9 views
12

Si creo un Set en Scala usando Set(1, 2, 3) obtengo un immutable.Set.Crear listas y conjuntos en Scala: ¿Qué obtengo realmente?

scala> val s = Set(1, 2, 3) 
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3) 

P1: ¿Qué tipo de Set es esto en realidad? ¿Es un juego de hash? ¿Cuál es la complejidad de las búsquedas, por ejemplo?

Q2: ¿Dónde puedo leer sobre este método de "creación de conjuntos"? Pensé que era el método apply pero el doc dice "Este método permite que los conjuntos sean interpretados como predicados. Se devuelve verdadero, si y sólo si este conjunto contiene elemento elem."


mismo modo, si se crea una List usando List(1, 2, 3), consigo

scala> val l = List(1, 2, 3) 
l: List[Int] = List(1, 2, 3) 

scala> l.getClass 
res13: java.lang.Class[_] = class scala.$colon$colon 

P3: Una vez más, ¿qué consigo? En este caso, ni siquiera puedo decir si es mutable o no, ya que ni siquiera forma parte del paquete scala.collection. ¿Por qué esto vive en el paquete scala?

Q4: ¿Dónde en la API puedo leer acerca de este método de "creación de listas"?

Respuesta

22

Q1: En este caso específico obtienes un Set3 que es un conjunto inmutable de exactamente tres argumentos. Presumiblemente, usa if-else if-else para verificar la inclusión. Si creas un conjunto de más de 4 elementos, obtienes un conjunto de hash inmutable.

Q2: Necesita ver el método apply del objeto Conjunto, no la clase. El método apply de la clase Set es lo que se llama cuando haces someSet(something).

P3: scala.:: es una que no esté vacía lista enlazada inmutable (si lo hace List() sin argumentos, se obtiene Nil que es una lista vacía inmutable). Vive en el paquete scala porque se considera tan básico que pertenece al paquete base.

Q4: Ver Q2.

+0

Aah, gracias! ¿Tienes un enlace para el objeto 'Set' que mencionas? (¡Solo puedo encontrar el rasgo!) – aioobe

+0

@aioobe: http://tinyurl.com/3y8fnpy – sepp2k

+0

@aiobe: A Stackoverflow no le gustaba el '$' en la URL, así que lo edité para usar tinyurl. – sepp2k

12

sólo para añadir a la excelente respuesta de sepp2k a la Q3, donde dice

Vive en el paquete scala porque se considera tan básico que pertenece en el paquete base.

Esto se aplica a Scala 2,7

En Scala 2.8, las clases de colecciones se han reorganizado, y ahora las vidas de clase en ::scala.collection.immutable, y el nombre scala.:: es un alias de tipo para scala.collection.immutable.::.

Welcome to Scala version 2.8.0.RC5 (OpenJDK 64-Bit Server VM, Java 1.6.0_18). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> val l = List(1, 2, 3) 
l: List[Int] = List(1, 2, 3) 

scala> l.getClass 
res0: java.lang.Class[_] = class scala.collection.immutable.$colon$colon 

scala> scala.:: 
res1: collection.immutable.::.type = [email protected] 
1

si se llama método getClass en el

scala> val list = List(1,2,3,45) 
list: List[Int] = List(1, 2, 3, 45) 

scala> val seq = Seq(1,2,3,4,5) 
seq: Seq[Int] = List(1, 2, 3, 4, 5) 

scala> list.getClass 
res13: Class[_ <: List[Int]] = class scala.collection.immutable.$colon$colon 

scala> seq.getClass 
res14: Class[_ <: Seq[Int]] = class scala.collection.immutable.$colon$colon 

Eso es porque scala.collection.immutable.List es una clase abstracta, y viene con dos implementaciones: la clase scala.Nil y Scala. ::. En Scala, :: es un identificador válido, y puede usarlo para nombrar una clase. Nil representa una lista vacía, y scala. :: representa cualquier lista no vacía.

Cuestiones relacionadas