Hoy vamos a revisar algo más que ya has aprendido
para realmente llevarlo a casa.
El tema es la diferencia entre Arreglos literales y dinámicos.
Lo que aprenderá es que:
Las matrices literales no se crean mediante el envío de mensajes,
se crean mensajes dinámicos en tiempo de ejecución usando mensajes,
pero ambas son instancias de la clase de array.
Son simplemente dos métodos para crear matrices.
Si tu recuerdas,
para crear una matriz literal, usamos la sintaxis # (
y en el medio, Puedo poner cualquier objeto en forma textual.
En este caso, el número entero 45, la cuerda 'milou'
el número 1300, el booleano verdadero,
y el símbolo #tintin.
Si le pregunto a este objeto literal para su clase,
el valor de retorno es una instancia de Array.
La versión dinámica
de esta matriz literal, está aquí mismo.
Entonces para crear una matriz dinámica, Tomo la clase de array,
Creo una instancia usando el método "con-con-con-con".
Lo envío con todos estos valores
y crea una instancia de clase de matriz igual a la anterior.
Es solo dos maneras diferentes de crear objetos
Esta es otra versión de la matriz dinámica.
Podría haber creado un array manualmente
enviando el mensaje "nuevo" a la clase de array.
Entonces habría usado "at" y "put" para completar la matriz,
y luego devuelve la matriz.
Esta es otra forma de crear una matriz dinámica
Pero también tenemos una sintaxis específica llamado azúcar sintáctico,
que está hecho con llaves.
¿Bueno?
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é aparatos ortopédicos
y poner un conjunto de expresiones separados por puntos,
que se evaluará para crear la colección.
La gran diferencia
entre una matriz literal
y una matriz creado dinámicamente con llaves ...
Si tomo la expresión ...
Aquí hay un ejemplo:tomo una variable e inicialízalo a las 12.
Quiero crear una matriz. Como es una matriz literal, uso # (
y agrego 'a + 1.13'
y devuelve esta matriz.
Es una matriz que contendrá los símbolos a y +,
entero 1, símbolo y entero 13.
Hago lo mismo aquí con una matriz dinámica.
a = 12
llaves a + 1. 13
y obtengo una matriz 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 evaluado
antes de crear una matriz.
Entonces la diferencia importante está aquí mismo:
Cuando uso frenillos, ejecuta expresiones,
sin embargo cuando uso # ( para crear una matriz literal,
las expresiones literales no se ejecutan
Por qué no?
Porque es el compilador lo que crear la matriz
en el caso de una matriz literal.
Aquí está otro un ejemplo algo más complicado.
Empiezo con # (
y reutilizo paréntesis dentro. Entonces, este es un punto.
Y reutilizo paréntesis para producir una matriz literal anidada.
Vemos que nada se interpretó en esta matriz literal,
porque fue creado en compilación por el compilador.
Entonces tenemos una matriz que contiene matrices anidadas.
Puedes verlos aquí.
La primera matriz anidada contiene 10,
el símbolo @, el número entero 20, etc.
Para darle prueba: Si pido el elemento 1 de esta matriz,
Obtengo una matriz
Cada vez que pongo paréntesis en una matriz literal,
crea matrices anidadas.
¿Qué es importante recordar?
es que tenemos un solo tipo de matriz en Pharo:
La clase de matriz y sus instancias.
Pero hay varias formas para obtener instancias y crear matrices.
La primera forma es la sintaxis literal: # (
Tenga cuidado, se crean arrays. por el compilador en tiempo de compilación.
Tenemos la forma dinámica simple: Array nuevo.
Envío el mensaje "nuevo a la clase de array.
Y tenemos otro más método dinámico sintácticamente compacto
con llaves antes y después, y expresiones separadas por puntos
que se evalúan para crear una matriz.