tipos que programacion matriz dinamico declarar como bidimensional array arrays scala

arrays - matriz - que es un array en programacion



¿Cómo creo una matriz heterogénea en Scala? (4)

Scala podría tener la posibilidad de una lista "heterogénea" pronto: HList en Scala

En Javascript, podemos hacer:

["a string", 10, {x : 1}, function() {}].push("another value");

¿Cuál es el equivalente de Scala?


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

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

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


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. Una HList de las anteriores (necesita la biblioteca MetaScala) sería (no probada ya que no uso MetaScala):

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

Puede agregar, etc. (bueno, al menos anteponer) a dicha lista, y sabrá los tipos. El preanálisis crea un nuevo tipo que tiene el tipo antiguo como cola.

Entonces hay un enfoque no mencionado todavía. Las clases (especialmente las clases de casos) son muy leves en Scala y puedes hacerlas como frases únicas:

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 tampoco implicará anexar.


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. Entonces puedes hacer algo como esto:

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

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

A propósito, la "sintaxis literal" para las matrices en Scala es la siguiente:

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

Ver también : Más información sobre vectores persistentes