Hoy vamos a revisar algo que ya has aprendido
para realmente llevarlo a casa.
El tema es la diferencia entre Arrays literales y dinámicos.
Lo que aprenderás es que:
Los Arrays literales no se crean mediante el envío de mensajes,
y los dinámicos se crean en tiempo de ejecución usando mensajes,
pero ambos son instancias de la clase Array.
Son simplemente dos métodos para crear arrays.
Si recuerdas,
para crear un array literal, usamos la sintaxis # (
y en el medio, puedo poner cualquier objeto en forma textual.
En este caso, el número entero 45, el string 'milou'
el número 1300, el booleano true,
y el símbolo #tintin.
Si le pregunto a este objeto literal por su clase,
el valor de retorno es Array.
La versión dinámica
de este array literal, está aquí mismo.
Entonces para crear un array dinámico, tomo la clase Array,
creo una instancia usando el método "with-with-with-with".
Lo envío con todos estos valores
y crea una instancia de la clase Array igual a la anterior.
Es solo dos maneras diferentes de crear objetos.
Esta es otra versión del array dinámico.
Podría haber creado un array manualmente
enviando el mensaje "new" a la clase Array.
Entonces habría usado "at" y "put" para completarlo,
y luego retornarlo.
Esta es otra forma de crear un array dinámico.
Pero también tenemos una sintaxis específica (syntactic sugar),
que está hecha con llaves.
¿Bien?
Estas llaves me permiten escribir exactamente lo que escribí arriba,
solo más rápido y más conciso.
Pero es lo mismo.
Esto significa que usaré llaves
y pondré un conjunto de expresiones separadas por puntos,
que se evaluarán para crear la colección.
La gran diferencia
entre un array literal
y uno dinámico con llaves ...
Si tomo la expresión ...
Aquí hay un ejemplo: tomo una variable e la inicializo con 12.
Quiero crear un array. Como es literal, uso # (
y agrego 'a + 1. 13'
y devuelve este array.
Es un array que contendrá los símbolos #a y #+ ,
el entero 1, el símbolo #. y el entero 13.
Hago lo mismo aquí con una array dinámico.
a := 12
{ a + 1. 13}
y obtengo un array con 2 elementos:
13 y 13.
¿Por qué?
Porque a + 1 fue evaluado como una expresión.
a = 12 + 1. 13
Cada expresión separada por un punto fue evaluada
antes de crear el array.
Entonces la diferencia importante está aquí mismo:
Cuando uso llaves, ejecuta expresiones,
sin embargo cuando uso # ( para crear un array literal,
las expresiones literales no se ejecutan.
¿Por qué no?
Porque es el compilador el que crear el array
en el caso de un array literal.
Aquí está otro ejemplo algo más complicado.
Empieza con # (
y reutilizo paréntesis dentro. Entonces, este es el punto.
Y reutilizo paréntesis para producir un array literal anidado.
Vemos que nada se interpretó en este array literal,
porque fue creado en tiempo de compilación por el compilador.
Entonces tenemos un array que contiene arrays anidados.
Puedes verlos aquí.
El primer array anidado contiene 10,
el símbolo @, el número entero 20, etc.
Para demostrarlo: Si pido el elemento 1 de este array,
Obtengo un array.
Cada vez que pongo paréntesis en un array literal,
crea arrays anidados.
Lo importante de recordar
es que tenemos un solo tipo de array en Pharo:
La clase Array y sus instancias.
Pero hay varias formas para obtener instancias y crear arrays.
La primera forma es la sintaxis literal: # (
Tenga cuidado, los arrays son creados por el compilador en tiempo de compilación.
Tenemos la forma dinámica simple: Array new.
Envío el mensaje "new" a la clase Array.
Y tenemos otro método dinámico sintácticamente más compacto
con llaves antes y después, y expresiones separadas por puntos
que se evalúan para crear un array.