2008-10-09 32 views

Respuesta

40

Las matrices en Scala son muy homogéneas. Esto se debe a que Scala es un lenguaje estáticamente tipado. Si realmente necesita características pseudo heterogéneas, debe usar una estructura de datos inmutables que se parametrice de forma coherente (son las estructuras de datos más inmutables). List es el ejemplo canónico allí, pero Vector también es una opción. A continuación, puede hacer algo como esto:

Vector("a string", 10, Map("x" -> 1),()=>()) + "another value" 

El resultado será de tipo Vector[Any]. No es muy útil en términos de tipeo estático, pero todo estará allí según lo prometido.

Por cierto, la "sintaxis literal" para matrices en Scala es el siguiente:

Array(1, 2, 3, 4)  // => Array[Int] containing [1, 2, 3, 4] 

Ver también: More info on persistent vectors

+9

Esta respuesta es tremendamente confusa: el hecho es que el ejemplo del OP funciona perfectamente bien con un Scala 'Array', como muestra la respuesta de @ soc. Existen otras opciones como 'Lista' y' Vector', pero las razones para usarlas o no usarlas no tienen nada que ver con si el caso de uso es homogéneo o "pseudo heterogéneo". –

+1

La respuesta está entrelazada con una jerga que puede hacer que sea confusa. También explica mucho si entiendes lo que dice. Sospecho que esta redacción se hizo a propósito, ya que el OP viene de javascript. – providence

+4

No, así es como hablan los nativos de Scala. Es totalmente normal. (Y me refiero a esto honestamente, no estoy tratando de ser sarcástico.) –

4

Scala podría tener la capacidad para obtener una lista "heterogéneo" pronto : HList in Scala

+3

Aunque tenga en cuenta que HList no cambia el idioma en absoluto, entonces si HList puede hacerlo, siempre ha estado en Scala. –

18

Scala elegirá el tipo de elemento de matriz más específico que pueda contener todos los valores, en este caso se necesita el tipo más general Any que es un supertipo de cualquier otro tipo:

Array("a string", 10, new { val x = 1 },() =>()) :+ "another value" 

La matriz resultante será de tipo Array[Any].

2

Personalmente, probablemente usaría tuplas, como menciona en un comentario.

scala> ("a string", 10, (1),() => {}) 
res1: (java.lang.String, Int, Int,() => Unit) = (a string,10,1,<function0>) 

Pero no se puede agregar fácilmente a tales estructuras.

La HList mencionada por ePharaoh está "hecha para esto", pero probablemente me mantendría alejado de ella. Es pesado en la programación de tipos y, por lo tanto, puede llevar consigo cargas sorprendentes (es decir, crear muchas clases cuando se compila). Sólo sé cuidadoso. Un nodo Hlist de los anteriores (necesita biblioteca MetaScala) sería (no probada, puesto que yo no uso MetaScala):

scala> "a string" :: 10 :: (1) ::() => {} :: HNil 

puede anexar etc. (bueno, al menos anteponer) a una lista de este tipo, y sabrá los tipos. El preanálisis crea un nuevo tipo que tiene el tipo antiguo como cola.

Luego hay un enfoque aún no mencionado. Las clases (especialmente clases de casos) son muy ligeros en la Scala y usted puede hacer como una sola línea:

scala> case class MyThing(str: String, int: Int, x: Int, f:() => Unit) 
defined class MyThing 

scala> MyThing("a string", 10, 1,()=>{}) 
res2: MyThing = MyThing(a string,10,1,<function0>) 

Por supuesto, esto no va a manejar ya sea añadiendo.

Cuestiones relacionadas