WEBVTT

00:00:00.960 --> 00:00:05.160 align:middle
En este curso,
Estudiaremos los elementos esenciales

00:00:05.320 --> 00:00:07.600 align:middle
de la jerarquía de colecciones en Pharo.

00:00:07.760 --> 00:00:11.760 align:middle
Veremos que Pharo
tiene muchos tipos de colecciones.

00:00:11.920 --> 00:00:14.960 align:middle
Hacen la vida de un programador más fácil

00:00:15.120 --> 00:00:17.360 align:middle
ya que todas comparten la misma API.

00:00:17.520 --> 00:00:22.720 align:middle
También veremos la diferencia
entre colecciones literales y dinámicas.

00:00:23.960 --> 00:00:28.720 align:middle
La API de las colecciones es muy diversa:
Hay muchos tipos de colecciones.

00:00:28.880 --> 00:00:32.360 align:middle
Todos comparten una API común
que está bien organizada

00:00:32.520 --> 00:00:34.880 align:middle
y hacen la vida del programador más fácil.

00:00:35.440 --> 00:00:37.880 align:middle
¿Qué es específico de Pharo?

00:00:38.040 --> 00:00:41.000 align:middle
Que el primer elemento se sitúa en el índice 1

00:00:41.160 --> 00:00:43.560 align:middle
en lugar de 0 como en otros idiomas.

00:00:44.280 --> 00:00:47.880 align:middle
Las colecciones pueden contener
cualquier tipo de objetos en Pharo.

00:00:48.040 --> 00:00:50.840 align:middle
No siempre es el caso
en otros idiomas

00:00:51.440 --> 00:00:55.240 align:middle
Algunas de las mas notables
y ampliamente utilizadas colecciones.

00:00:55.400 --> 00:00:57.960 align:middle
OrderedCollection
es una colección dinámica

00:00:58.120 --> 00:01:02.160 align:middle
que crece
cada vez que agregue elementos en ella.

00:01:02.320 --> 00:01:05.560 align:middle
Array es una colección de tamaño fijo.

00:01:05.720 --> 00:01:09.200 align:middle
Puede acceder a los elementos
mediante un índice,

00:01:09.360 --> 00:01:13.280 align:middle
Set, que contiene elementos únicos
sin duplicados

00:01:13.440 --> 00:01:16.200 align:middle
No puede insertar el mismo elemento dos veces.

00:01:16.360 --> 00:01:21.160 align:middle
Los Dictionary son tablas hash:
a una llave se le asocia un valor.

00:01:22.040 --> 00:01:24.840 align:middle
Aquí tiene un extracto
de la jerarquía de Collection.

00:01:25.000 --> 00:01:28.160 align:middle
Es solo un extracto,
Pharo, es más grande.

00:01:28.320 --> 00:01:31.240 align:middle
Hay muchas clases
Todas derivan de Collection

00:01:31.400 --> 00:01:34.120 align:middle
con una API compartida
para todas las colecciones.

00:01:34.880 --> 00:01:39.160 align:middle
En este curso, le mostraré
sobre aquellos en negrita.

00:01:40.480 --> 00:01:44.240 align:middle
Hay una API compartida
con siete puntos

00:01:44.400 --> 00:01:49.240 align:middle
métodos específicos para la creación
de las colecciones, enviados a las clases,

00:01:49.400 --> 00:01:52.120 align:middle
métodos específicos
para acceder a sus propiedades

00:01:52.280 --> 00:01:54.840 align:middle
el tamaño de las colecciones

00:01:55.000 --> 00:01:57.840 align:middle
o incluso los elementos que contienen

00:01:58.000 --> 00:02:00.920 align:middle
métodos de prueba
¿La colección está vacía?

00:02:01.080 --> 00:02:05.320 align:middle
elementos que agregan y quitan métodos,
recuento de elementos de la colección

00:02:05.480 --> 00:02:11.400 align:middle
Quiero explorar los elementos
o saber si un elemento está allí

00:02:11.560 --> 00:02:15.920 align:middle
y métodos de conversión
de un tipo a otro

00:02:16.760 --> 00:02:20.640 align:middle
Comencemos con un ejemplo
Quiero crear una colección en Pharo.

00:02:20.800 --> 00:02:24.120 align:middle
Solo seleccionaré
la clase en la que estoy interesado

00:02:24.280 --> 00:02:28.040 align:middle
y enviare el mensaje "new"
para instanciar esta clase.

00:02:28.200 --> 00:02:30.360 align:middle
Primera opción, uso "new".

00:02:30.520 --> 00:02:33.720 align:middle
Segunda opción, no puedo usar "new" directamente.

00:02:33.880 --> 00:02:36.360 align:middle
Quiero especificar el tamaño
de la colección

00:02:36.520 --> 00:02:41.440 align:middle
Podría enviar "new: 4".
Creo una matriz de tamaño 4 o de tamaño 2.

00:02:41.600 --> 00:02:45.720 align:middle
También funciona con OrderedCollection.
Podría crear uno de tamaño 1000.

00:02:47.400 --> 00:02:51.920 align:middle
Hay otros métodos existentes
para crear colecciones preinicializadas

00:02:52.080 --> 00:02:53.520 align:middle
"withAll:" por ejemplo.

00:02:53.680 --> 00:02:58.360 align:middle
Le pasaré una colección literal.
Una colección literal comienza con "#(".

00:02:59.120 --> 00:03:02.480 align:middle
Me creara una nueva instancia
de la OrderedCollection

00:03:02.640 --> 00:03:06.760 align:middle
que contendrá todos los elementos
pasados al ser creado

00:03:07.600 --> 00:03:09.360 align:middle
Podría hacer lo mismo con Set

00:03:09.520 --> 00:03:12.760 align:middle
En un conjunto, no puede tener ningún duplicado.

00:03:12.920 --> 00:03:16.640 align:middle
El número 7, que tiene dos veces
en la colección literal,

00:03:16.800 --> 00:03:19.000 align:middle
no puede terminar dos veces en Set.

00:03:21.200 --> 00:03:25.680 align:middle
Hay otros tipos de mensajes
que puede enviar

00:03:25.840 --> 00:03:27.920 align:middle
a las clases para inicializarlas.

00:03:28.080 --> 00:03:31.600 align:middle
Este es otro ejemplo "new: withAll:"

00:03:31.760 --> 00:03:33.880 align:middle
Quiero una colección de tamaño 5.

00:03:34.040 --> 00:03:37.360 align:middle
Cada caja debe inicializarse
con un objeto específico:

00:03:37.520 --> 00:03:40.000 align:middle
en este caso, una cadena que contiene a.

00:03:42.240 --> 00:03:46.400 align:middle
Recuerde que en Pharo,
cada colección comienza en el índice 1.

00:03:46.560 --> 00:03:49.480 align:middle
Si le pregunto a esta colección de 3 elementos

00:03:49.640 --> 00:03:53.440 align:middle
para devolver el elemento en el índice 2,
será este.

00:03:53.600 --> 00:03:56.000 align:middle
Esto es 1, esto es 2, esto es 3

00:03:56.760 --> 00:03:58.960 align:middle
Lo mismo con OrderedCollection:

00:03:59.120 --> 00:04:02.480 align:middle
Si convierto esta colección
y le pido que devuelva su índice 2,

00:04:02.640 --> 00:04:04.560 align:middle
Obtendré el mismo resultado hates.

00:04:05.840 --> 00:04:09.960 align:middle
Las colecciones pueden contener
cualquier tipo de objetos

00:04:10.120 --> 00:04:12.280 align:middle
Le mostraré un ejemplo

00:04:12.440 --> 00:04:16.920 align:middle
esta colección literal
contiene la secuencia calvin

00:04:17.080 --> 00:04:22.000 align:middle
y una colección
que contiene los números 1, 2, 3.

00:04:22.160 --> 00:04:23.960 align:middle
Puedo crear una tabla.

00:04:24.120 --> 00:04:28.360 align:middle
Esta tabla está compuesta
de los elementos 1, 2

00:04:29.360 --> 00:04:32.600 align:middle
y un Set() al final.

00:04:33.360 --> 00:04:37.160 align:middle
Agregué el elemento 1 aquí,
luego el elemento 2, luego el Set.

00:04:37.920 --> 00:04:41.160 align:middle
Puedo recorrer
los elementos de una colección

00:04:41.320 --> 00:04:43.800 align:middle
utilizando el mensaje, "do:" por ejemplo.

00:04:44.600 --> 00:04:46.400 align:middle
Esta es una colección

00:04:47.400 --> 00:04:51.080 align:middle
a la que enviaré el mensaje "do:"
antes de pasarle un bloque.

00:04:51.720 --> 00:04:56.920 align:middle
El bloque comienza con "["
y termina con "]".

00:04:57.080 --> 00:05:00.720 align:middle
El parámetro del bloque se llama ":each".

00:05:00.880 --> 00:05:03.240 align:middle
Se separa
del cuerpo del bloque mediante |.

00:05:03.400 --> 00:05:07.200 align:middle
Con cada ciclo, el valor de ":each"
es el primer elemento de la colección,

00:05:07.360 --> 00:05:08.800 align:middle
luego el segundo, etc.

00:05:08.960 --> 00:05:12.440 align:middle
Y en el Transcript, usted puede ver
Calvin hates Suzie.

00:05:14.480 --> 00:05:18.120 align:middle
Los Array son colecciones de tamaño fijo.

00:05:18.280 --> 00:05:22.280 align:middle
Puedo preguntar a un Array su tamaño:
Enviando el mensaje "size".

00:05:22.440 --> 00:05:26.440 align:middle
Puedo acceder al elemento de un Array
enviando el mensaje "at:"

00:05:26.600 --> 00:05:28.120 align:middle
Quiero el segundo elemento.

00:05:28.280 --> 00:05:31.640 align:middle
Puedo modificar el elemento
en el índice 2 de la colección

00:05:31.800 --> 00:05:35.160 align:middle
enviando "a:1 put:'Calvin'"

00:05:35.680 --> 00:05:38.400 align:middle
Inserto la cadena Calvin
en celda 1

00:05:39.160 --> 00:05:41.040 align:middle
También puedo preguntar el tamaño.

00:05:41.200 --> 00:05:44.600 align:middle
Lo interesante de este ejemplo

00:05:44.760 --> 00:05:47.800 align:middle
es que la misma matriz
se ha construido de dos maneras

00:05:47.960 --> 00:05:51.720 align:middle
primero una versión literal,
luego una versión dinámica.

00:05:51.880 --> 00:05:56.360 align:middle
Aquí instancié
la clase Array por si misma

00:05:56.520 --> 00:05:58.120 align:middle
y lleno en cada celda.

00:05:59.440 --> 00:06:03.200 align:middle
Puede enviar "size" a una colección
para conocer su tamaño

00:06:03.360 --> 00:06:07.600 align:middle
Puede acceder al elemento de una colección
usando el método "at:"

00:06:07.760 --> 00:06:09.200 align:middle
Ya lo mencioné.

00:06:10.480 --> 00:06:12.480 align:middle
Tenga cuidado

00:06:12.640 --> 00:06:16.000 align:middle
cuando acceda a un elemento
proporcionando un índice,

00:06:16.160 --> 00:06:18.400 align:middle
debe asegurarse que el índice

00:06:18.560 --> 00:06:23.400 align:middle
está dentro de los límites de la colección.
Debería ser más pequeño que su tamaño.

00:06:23.560 --> 00:06:27.720 align:middle
Si le pido a esta colección que regrese
el elemento en el índice 55, no existirá.

00:06:27.880 --> 00:06:30.400 align:middle
Devolverá un error.

00:06:33.360 --> 00:06:35.480 align:middle
Para modificar los elementos

00:06:35.640 --> 00:06:40.120 align:middle
en el índice 2, quiero insertar
Un nuevo elemento en la colección.

00:06:40.280 --> 00:06:43.960 align:middle
La cadena 'loves'
reemplazará los 'hates'

00:06:44.120 --> 00:06:46.200 align:middle
Puede verlo en el resultado.

00:06:48.800 --> 00:06:52.080 align:middle
Arreglos literales

00:06:52.240 --> 00:06:55.400 align:middle
Este es un ejemplo de una matriz literal.

00:06:55.560 --> 00:06:57.840 align:middle
Comienza con #(

00:06:58.000 --> 00:07:01.520 align:middle
Puede poner algo dentro
un número, una cadena, etc.

00:07:02.360 --> 00:07:05.160 align:middle
Todas las tablas literales en Pharo

00:07:05.320 --> 00:07:07.840 align:middle
son instancias de la clase Array
por defecto.

00:07:08.000 --> 00:07:10.960 align:middle
Puedo enviar el mensaje "class"
a una matriz literal.

00:07:11.120 --> 00:07:14.920 align:middle
Devuelve Array, lo que significa
Es instancia de la matriz de clases.

00:07:18.800 --> 00:07:22.400 align:middle
Versiones dinámicas y literales
Son equivalentes en Pharo.

00:07:22.560 --> 00:07:26.440 align:middle
Las matrices literales son simplemente más cortas
puede escribirlas más rápido.

00:07:26.600 --> 00:07:29.760 align:middle
Aquí tiene la versión literal
de una colección

00:07:29.920 --> 00:07:33.760 align:middle
Y
 esa es la versión dinámica
donde instancio la clase Array

00:07:33.920 --> 00:07:37.240 align:middle
Son equivalentes
ya que devuelven los mismos resultados.

00:07:40.000 --> 00:07:43.560 align:middle
La clase OrderedCollection
define una colección específica

00:07:43.720 --> 00:07:45.600 align:middle
que se puede extender

00:07:45.760 --> 00:07:48.640 align:middle
Cada vez que agrega elementos, crece.

00:07:49.280 --> 00:07:53.320 align:middle
Instancio OrderedCollection
enviando el mensaje "new"

00:07:53.480 --> 00:07:57.040 align:middle
Uso el método "add:" para adjuntar
nuevos elementos en esta colección.

00:07:57.200 --> 00:08:01.280 align:middle
Podría usar "addFirst:" para agregar un elemento
al inicio de la colección.

00:08:01.440 --> 00:08:03.080 align:middle
Por defecto, lo agregaría al final.

00:08:04.400 --> 00:08:07.600 align:middle
Puedes ver lo que devuelve la colección.

00:08:07.760 --> 00:08:11.440 align:middle
Se compone de tres elementos:
Pharo, Reef, Pharo.

00:08:11.600 --> 00:08:15.400 align:middle
agregando 'Seaside',
'Seaside' se agrega al final.

00:08:17.760 --> 00:08:21.520 align:middle
Tengo métodos de conversión
entre un tipo de colección y otro.

00:08:21.680 --> 00:08:26.160 align:middle
Aquí estoy usando una colección literal,
que es una matriz.

00:08:26.320 --> 00:08:30.440 align:middle
El mensaje asOrderedCollection
convertirá esta matriz

00:08:30.600 --> 00:08:32.600 align:middle
en una colección ordenada.

00:08:33.520 --> 00:08:37.200 align:middle
Los Set son un tipo de colección
sin duplicados

00:08:37.360 --> 00:08:41.600 align:middle
Se pueden extender
Crecen con cada elemento agregado.

00:08:41.760 --> 00:08:45.560 align:middle
Puedo usar una colección literal
Me convierto en un conjunto.

00:08:45.720 --> 00:08:49.080 align:middle
Termino con un set
sin ningún duplicado

00:08:49.880 --> 00:08:53.400 align:middle
También podría elegir la versión dinámica
sobre el literal

00:08:53.560 --> 00:08:57.720 align:middle
"Set with: with:" crea un conjunto
y lo llena con dos elementos,

00:08:57.880 --> 00:08:59.440 align:middle
eso es dos conjuntos cada vez.

00:09:02.000 --> 00:09:06.640 align:middle
Los métodos de conversión son convenientes para
convertir una colección en otra tipo.

00:09:06.800 --> 00:09:11.280 align:middle
Siempre es lo mismo "as" mas el nombre
de la colección que desea obtener.

00:09:13.840 --> 00:09:17.000 align:middle
Los Dictionary son un grupo
de colección clave valor

00:09:17.160 --> 00:09:19.280 align:middle
Asocio un valor a una clave.

00:09:19.440 --> 00:09:22.760 align:middle
Se pueden extender
Crecen con cada elemento agregado.

00:09:22.920 --> 00:09:25.560 align:middle
Dispone de una API inusual

00:09:25.720 --> 00:09:28.360 align:middle
sobre esta colección

00:09:28.520 --> 00:09:32.120 align:middle
el mensaje típico "at:", "at: ifAbsent:"

00:09:32.280 --> 00:09:37.200 align:middle
para acceder a
una clave específica que no existe

00:09:37.360 --> 00:09:42.160 align:middle
"at: put:" inserta un nuevo valor
en una clave específica.

00:09:42.320 --> 00:09:47.520 align:middle
Puedo repetir usando mensajes típicos.
como "do:",

00:09:47.680 --> 00:09:49.080 align:middle
pero también nuevos mensajes

00:09:49.240 --> 00:09:52.640 align:middle
como "keysDo:" para acceder a
todas las claves del diccionario

00:09:52.800 --> 00:09:54.280 align:middle
o "keysAndValuesDo:"

00:09:54.440 --> 00:09:58.240 align:middle
Por ejemplo, creo una instancia
de la clase Dictionary

00:09:59.040 --> 00:10:03.360 align:middle
Imagine el diccionario como una tabla

00:10:03.520 --> 00:10:08.040 align:middle
a la clave Enero asocio 31,
a la clave Febrero 28,

00:10:08.200 --> 00:10:10.160 align:middle
a la clave Marzo 31.

00:10:12.840 --> 00:10:16.280 align:middle
Es equivalente a una colección dinámica.

00:10:16.440 --> 00:10:21.480 align:middle
Crea una colección dinámica con {

00:10:21.640 --> 00:10:23.720 align:middle
{}

00:10:23.880 --> 00:10:26.640 align:middle
Utiliza flechas para crear asociaciones.

00:10:26.800 --> 00:10:29.000 align:middle
Este es un símbolo

00:10:29.160 --> 00:10:33.080 align:middle
Al símbolo enero
asocio el número 31.

00:10:33.240 --> 00:10:35.720 align:middle
Tengo una colección de asociaciones

00:10:35.880 --> 00:10:38.440 align:middle
Me convierto en un diccionario
con asDictionary

00:10:38.600 --> 00:10:42.840 align:middle
Estas dos formas para crear un diccionario
son equivalentes

00:10:45.480 --> 00:10:48.280 align:middle
Si pido a una Association key,

00:10:48.440 --> 00:10:50.760 align:middle
devolverá la llave,
así el comienzo

00:10:50.920 --> 00:10:52.400 align:middle
Es lo mismo.

00:10:52.560 --> 00:10:56.400 align:middle
Si pido a una Association value,
solo devolverá el valor.

00:10:56.560 --> 00:10:58.760 align:middle
Esto es un par o una asociación.

00:11:00.560 --> 00:11:01.760 align:middle
Dictionary

00:11:01.920 --> 00:11:06.080 align:middle
si quiero acceder a un valor específico
en un diccionario,

00:11:06.240 --> 00:11:11.600 align:middle
Solo necesito usar "at:" para especificar
la clave cuyo valor quiero.

00:11:11.760 --> 00:11:13.800 align:middle
Si la clave no existe,

00:11:14.360 --> 00:11:17.720 align:middle
Recibo un error a cambio.

00:11:18.560 --> 00:11:23.000 align:middle
Para evitar eso,
Puedo usar "at: ifAbsent:"

00:11:23.160 --> 00:11:26.600 align:middle
Escribo "at:" más una clave
que no existe en el diccionario.

00:11:26.760 --> 00:11:30.720 align:middle
si está ausente,
devolverá este valor, 0.

00:11:31.480 --> 00:11:35.040 align:middle
La clave no existe en el diccionario,
así que obtengo el valor 0.

00:11:35.200 --> 00:11:40.480 align:middle
Puedo iterar sobre un diccionario
utilizando "do:" sobre sus elementos

00:11:40.640 --> 00:11:45.280 align:middle
Solo obtengo los valores del diccionario.
No puedo ver las llaves.

00:11:45.440 --> 00:11:48.800 align:middle
Uno podría preguntarse por qué
ya que es bastante extraño

00:11:48.960 --> 00:11:50.720 align:middle
Es muy lógico, de hecho.

00:11:50.880 --> 00:11:55.560 align:middle
Si mira como se implementa "do:"
en Dictionary, toma un bloque

00:11:55.720 --> 00:11:58.760 align:middle
lo que pasa es "^self valuesDo:"

00:11:58.920 --> 00:12:01.480 align:middle
De forma predeterminada, si aplica un "do:"
a un diccionario,

00:12:01.640 --> 00:12:04.080 align:middle
solo navega por sus valores,
no las llaves

00:12:05.440 --> 00:12:07.040 align:middle
Si quiero explorar ambos,

00:12:07.200 --> 00:12:10.680 align:middle
Debo usar un método específico
llamado "keysAndValuesDo:"

00:12:10.840 --> 00:12:15.120 align:middle
que toma un bloque con dos argumentos
(:k y :v) como parámetros.

00:12:15.280 --> 00:12:18.680 align:middle
:k es una clave
y v: es el valor.

00:12:19.360 --> 00:12:22.160 align:middle
Mi diccionario está lleno.

00:12:23.880 --> 00:12:26.720 align:middle
En este curso, aprendimos que

00:12:26.880 --> 00:12:30.520 align:middle
Pharo tiene muchos tipos diferentes
de colecciones disponibles.

00:12:31.160 --> 00:12:33.800 align:middle
Las colecciones tienen un vocabulario común

00:12:33.960 --> 00:12:35.720 align:middle
cuando se trata de crearlas,

00:12:35.880 --> 00:12:38.760 align:middle
accediendo a sus elementos,
su tamaño, etc.

00:12:38.920 --> 00:12:41.080 align:middle
Hace que la vida de un programador sea más fácil.

00:12:41.240 --> 00:12:44.560 align:middle
Es fácil convertir una colección
en otro tipo

00:12:44.720 --> 00:12:46.600 align:middle
Incluso aprendimos algo más

00:12:46.760 --> 00:12:50.800 align:middle
cuando tiene preguntas, es fácil
mirar en el sistema, hacia Pharo,

00:12:50.960 --> 00:12:54.960 align:middle
leer el código de las clases
para aprender nuevas clases de colecciones.

