En este curso, Estudiaremos los elementos esenciales
de la jerarquía de colecciones en Pharo.
Veremos que Pharo tiene muchos tipos de colecciones.
Hacen la vida de un programador más fácil
ya que todas comparten la misma API.
También veremos la diferencia entre colecciones literales y dinámicas.
La API de las colecciones es muy diversa: Hay muchos tipos de colecciones.
Todos comparten una API común que está bien organizada
y hacen la vida del programador más fácil.
¿Qué es específico de Pharo?
Que el primer elemento se sitúa en el índice 1
en lugar de 0 como en otros idiomas.
Las colecciones pueden contener cualquier tipo de objetos en Pharo.
No siempre es el caso en otros idiomas
Algunas de las mas notables y ampliamente utilizadas colecciones.
OrderedCollection es una colección dinámica
que crece cada vez que agregue elementos en ella.
Array es una colección de tamaño fijo.
Puede acceder a los elementos mediante un índice,
Set, que contiene elementos únicos sin duplicados
No puede insertar el mismo elemento dos veces.
Los Dictionary son tablas hash: a una llave se le asocia un valor.
Aquí tiene un extracto de la jerarquía de Collection.
Es solo un extracto, Pharo, es más grande.
Hay muchas clases Todas derivan de Collection
con una API compartida para todas las colecciones.
En este curso, le mostraré sobre aquellos en negrita.
Hay una API compartida con siete puntos
métodos específicos para la creación de las colecciones, enviados a las clases,
métodos específicos para acceder a sus propiedades
el tamaño de las colecciones
o incluso los elementos que contienen
métodos de prueba ¿La colección está vacía?
elementos que agregan y quitan métodos, recuento de elementos de la colección
Quiero explorar los elementos o saber si un elemento está allí
y métodos de conversión de un tipo a otro
Comencemos con un ejemplo Quiero crear una colección en Pharo.
Solo seleccionaré la clase en la que estoy interesado
y enviare el mensaje "new" para instanciar esta clase.
Primera opción, uso "new".
Segunda opción, no puedo usar "new" directamente.
Quiero especificar el tamaño de la colección
Podría enviar "new: 4". Creo una matriz de tamaño 4 o de tamaño 2.
También funciona con OrderedCollection. Podría crear uno de tamaño 1000.
Hay otros métodos existentes para crear colecciones preinicializadas
"withAll:" por ejemplo.
Le pasaré una colección literal. Una colección literal comienza con "#(".
Me creara una nueva instancia de la OrderedCollection
que contendrá todos los elementos pasados al ser creado
Podría hacer lo mismo con Set
En un conjunto, no puede tener ningún duplicado.
El número 7, que tiene dos veces en la colección literal,
no puede terminar dos veces en Set.
Hay otros tipos de mensajes que puede enviar
a las clases para inicializarlas.
Este es otro ejemplo "new: withAll:"
Quiero una colección de tamaño 5.
Cada caja debe inicializarse con un objeto específico:
en este caso, una cadena que contiene a.
Recuerde que en Pharo, cada colección comienza en el índice 1.
Si le pregunto a esta colección de 3 elementos
para devolver el elemento en el índice 2, será este.
Esto es 1, esto es 2, esto es 3
Lo mismo con OrderedCollection:
Si convierto esta colección y le pido que devuelva su índice 2,
Obtendré el mismo resultado hates.
Las colecciones pueden contener cualquier tipo de objetos
Le mostraré un ejemplo
esta colección literal contiene la secuencia calvin
y una colección que contiene los números 1, 2, 3.
Puedo crear una tabla.
Esta tabla está compuesta de los elementos 1, 2
y un Set() al final.
Agregué el elemento 1 aquí, luego el elemento 2, luego el Set.
Puedo recorrer los elementos de una colección
utilizando el mensaje, "do:" por ejemplo.
Esta es una colección
a la que enviaré el mensaje "do:" antes de pasarle un bloque.
El bloque comienza con "[" y termina con "]".
El parámetro del bloque se llama ":each".
Se separa del cuerpo del bloque mediante |.
Con cada ciclo, el valor de ":each" es el primer elemento de la colección,
luego el segundo, etc.
Y en el Transcript, usted puede ver Calvin hates Suzie.
Los Array son colecciones de tamaño fijo.
Puedo preguntar a un Array su tamaño: Enviando el mensaje "size".
Puedo acceder al elemento de un Array enviando el mensaje "at:"
Quiero el segundo elemento.
Puedo modificar el elemento en el índice 2 de la colección
enviando "a:1 put:'Calvin'"
Inserto la cadena Calvin en celda 1
También puedo preguntar el tamaño.
Lo interesante de este ejemplo
es que la misma matriz se ha construido de dos maneras
primero una versión literal, luego una versión dinámica.
Aquí instancié la clase Array por si misma
y lleno en cada celda.
Puede enviar "size" a una colección para conocer su tamaño
Puede acceder al elemento de una colección usando el método "at:"
Ya lo mencioné.
Tenga cuidado
cuando acceda a un elemento proporcionando un índice,
debe asegurarse que el índice
está dentro de los límites de la colección. Debería ser más pequeño que su tamaño.
Si le pido a esta colección que regrese el elemento en el índice 55, no existirá.
Devolverá un error.
Para modificar los elementos
en el índice 2, quiero insertar Un nuevo elemento en la colección.
La cadena 'loves' reemplazará los 'hates'
Puede verlo en el resultado.
Arreglos literales
Este es un ejemplo de una matriz literal.
Comienza con #(
Puede poner algo dentro un número, una cadena, etc.
Todas las tablas literales en Pharo
son instancias de la clase Array por defecto.
Puedo enviar el mensaje "class" a una matriz literal.
Devuelve Array, lo que significa Es instancia de la matriz de clases.
Versiones dinámicas y literales Son equivalentes en Pharo.
Las matrices literales son simplemente más cortas puede escribirlas más rápido.
Aquí tiene la versión literal de una colección
Y esa es la versión dinámica donde instancio la clase Array
Son equivalentes ya que devuelven los mismos resultados.
La clase OrderedCollection define una colección específica
que se puede extender
Cada vez que agrega elementos, crece.
Instancio OrderedCollection enviando el mensaje "new"
Uso el método "add:" para adjuntar nuevos elementos en esta colección.
Podría usar "addFirst:" para agregar un elemento al inicio de la colección.
Por defecto, lo agregaría al final.
Puedes ver lo que devuelve la colección.
Se compone de tres elementos: Pharo, Reef, Pharo.
agregando 'Seaside', 'Seaside' se agrega al final.
Tengo métodos de conversión entre un tipo de colección y otro.
Aquí estoy usando una colección literal, que es una matriz.
El mensaje asOrderedCollection convertirá esta matriz
en una colección ordenada.
Los Set son un tipo de colección sin duplicados
Se pueden extender Crecen con cada elemento agregado.
Puedo usar una colección literal Me convierto en un conjunto.
Termino con un set sin ningún duplicado
También podría elegir la versión dinámica sobre el literal
"Set with: with:" crea un conjunto y lo llena con dos elementos,
eso es dos conjuntos cada vez.
Los métodos de conversión son convenientes para convertir una colección en otra tipo.
Siempre es lo mismo "as" mas el nombre de la colección que desea obtener.
Los Dictionary son un grupo de colección clave valor
Asocio un valor a una clave.
Se pueden extender Crecen con cada elemento agregado.
Dispone de una API inusual
sobre esta colección
el mensaje típico "at:", "at: ifAbsent:"
para acceder a una clave específica que no existe
"at: put:" inserta un nuevo valor en una clave específica.
Puedo repetir usando mensajes típicos. como "do:",
pero también nuevos mensajes
como "keysDo:" para acceder a todas las claves del diccionario
o "keysAndValuesDo:"
Por ejemplo, creo una instancia de la clase Dictionary
Imagine el diccionario como una tabla
a la clave Enero asocio 31, a la clave Febrero 28,
a la clave Marzo 31.
Es equivalente a una colección dinámica.
Crea una colección dinámica con {
{}
Utiliza flechas para crear asociaciones.
Este es un símbolo
Al símbolo enero asocio el número 31.
Tengo una colección de asociaciones
Me convierto en un diccionario con asDictionary
Estas dos formas para crear un diccionario son equivalentes
Si pido a una Association key,
devolverá la llave, así el comienzo
Es lo mismo.
Si pido a una Association value, solo devolverá el valor.
Esto es un par o una asociación.
Dictionary
si quiero acceder a un valor específico en un diccionario,
Solo necesito usar "at:" para especificar la clave cuyo valor quiero.
Si la clave no existe,
Recibo un error a cambio.
Para evitar eso, Puedo usar "at: ifAbsent:"
Escribo "at:" más una clave que no existe en el diccionario.
si está ausente, devolverá este valor, 0.
La clave no existe en el diccionario, así que obtengo el valor 0.
Puedo iterar sobre un diccionario utilizando "do:" sobre sus elementos
Solo obtengo los valores del diccionario. No puedo ver las llaves.
Uno podría preguntarse por qué ya que es bastante extraño
Es muy lógico, de hecho.
Si mira como se implementa "do:" en Dictionary, toma un bloque
lo que pasa es "^self valuesDo:"
De forma predeterminada, si aplica un "do:" a un diccionario,
solo navega por sus valores, no las llaves
Si quiero explorar ambos,
Debo usar un método específico llamado "keysAndValuesDo:"
que toma un bloque con dos argumentos (:k y :v) como parámetros.
:k es una clave y v: es el valor.
Mi diccionario está lleno.
En este curso, aprendimos que
Pharo tiene muchos tipos diferentes de colecciones disponibles.
Las colecciones tienen un vocabulario común
cuando se trata de crearlas,
accediendo a sus elementos, su tamaño, etc.
Hace que la vida de un programador sea más fácil.
Es fácil convertir una colección en otro tipo
Incluso aprendimos algo más
cuando tiene preguntas, es fácil mirar en el sistema, hacia Pharo,
leer el código de las clases para aprender nuevas clases de colecciones.