Translate

miércoles, 8 de marzo de 2017

Ceylon 1.3.2 fue liberado!!


El lenguaje diseñado por el amigo Gavin King, llego a su versión 1.3.2 y nos prueba que esta maduro y que tambien esta en todos lados.

Lo que prueba que la industria lo recibió muy bien. Recordemos que su objetivo era modernizar a Java pero no introducir conceptos extraños a java.

Ceylon 1.3.2 es un release menor del lenguaje pero con más de 100 temas cerrados. Esta versión presenta assemblies, que permiten exportar módulos de Ceylon como repositorios de Maven, hace que sea aún más fácil que antes tener un proyecto mixto de Java y Ceylon en Maven, permite la interpolación de cadenas en aserciones e introduce la inicialización perezosa para atributos.

 Esta versión de Ceylon ha sido probada con una amplia variedad de bibliotecas y frameworks Java, incluyendo:

  • Spring Boot,
  • WildFly and WildFly Swarm,
  • Hibernate (JPA),
  • RESTEasy (JAXB and JAX-RS),
  • Weld (CDI) and Guice,
  • Eclipse Equinox, Apache Karaf, and Apache Felix (OSGi),
  • Spark,
  • RxJava
  • JOGL (OpenGL), and
  • Android.
Y las mejoras más importantes son: 


  • Assemblies (archivo .cas)
  • Genera repositorios Maven 
  • Suporta proyerctos mixtos Java and Ceylon 
  • String interpolation en mensajes 
  • Initialización Lazy para atributos marcados para esto
Dejo link: 

Empezando con Elixir


Antes que nada tenemos que instalarlo, eso es fácil y más fácil si se utiliza linux, les dejo la guía de instalación: http://elixir-lang.org/install.html

Ojo antes que antes a leer un poco: http://emanuelpeg.blogspot.com.ar/search/label/Elixir

Si lo instalamos bien al escribir lo siguiente, veremos la versión:

% elixir -v
Erlang/OTP 19 [erts-8.0.2] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

Elixir 1.4.0

Empesemos utilizando el modo interactivo, como para amigarnos con el lenguaje. Para acceder a esto debemos tipear iex en la consola:

 ~ $ iex
Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:6:6] [async-threads:10] [kernel-poll:false]

Interactive Elixir (1.1.0-dev) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>

Y el cursor quedara en espera de comandos y nosotros podemos empezar a jugar!!!

Vamos a probar cosas básicas del lenguaje:

iex> 2+3
5
iex> 2+3 == 5
true
iex> String.length("The quick brown fox jumps over the lazy dog")
43

Veamos los datos básicos:

Integers

iex> 255
255

Podemos usar octales, binarios o hexadecimales:

iex> 0b0110
6
iex> 0o644
420
iex> 0x1F
31

Floats
En Elixir, el número flotante requiere un decimal antes/después del punto y permite usar la notación exponencial.

iex> 3.14
3.14
iex> .14
** (SyntaxError) iex:2: syntax error before: '.'
iex> 1.0e-10
1.0e-10

Booleans
Elixir soporta los valores True y False. Y todo es verdadero excepto false y nil

iex> true
true
iex> false
false

Atoms
Un átomo es una constante cuyo nombre es su valor. Si está familiarizado con Ruby, estos son sinónimos de Símbolos:

iex> :foo
:foo
iex> :foo == :bar
false
Los booleanos verdadero y falso son también los átomos: true y: false respectivamente.

iex> true |> is_atom
true
iex> :true |> is_boolean
true
iex> :true === true
true

Los nombres de los módulos en Elixir son también átomos. MyApp.MyModule es un átomo válido, incluso si aún no se ha declarado dicho módulo.

iex> is_atom(MyApp.MyModule)
true
Los átomos también se utilizan para referenciar módulos de las bibliotecas Erlang, incluidas las importadas.

iex> :crypto.rand_bytes 3
<<23, 104, 108>>

Strings o cadenas.
Las cadenas en Elixir tienen codificación UTF-8 y están envueltas entre comillas dobles:

iex> "Hello"
"Hello"
iex> "dziękuję"
"dziękuję"
Los String soportan espacios en blancos y enters, etc:

iex> "foo
...> bar"
"foo\nbar"
iex> "foo\nbar"
"foo\nbar"

Elixir incluye más tipos de datos complejos.

Operación.

Elixir soporta los operadores básicos como : +, -, *, y "/" .

iex> 2 + 2
4
iex> 2 - 1
1
iex> 2 * 5
10
iex> 10 / 5
2.0

Si necesita división entera o el resto de división, Elixir viene con dos funciones útiles para lograr esto:

iex> div(10, 5)
2
iex> rem(10, 3)
1

Boolean
Elixir provee operadores booleanos: ||, &&, y !

iex> -20 || true
-20
iex> false || 42
42

iex> 42 && true
true
iex> 42 && nil
nil

iex> !42
false
iex> !false
true

Hay tres operadores adicionales cuyo primer argumento debe ser un booleano (verdadero o falso):

iex> true and 42
42
iex> false or true
true
iex> not false
true
iex> 42 and true
** (ArgumentError) argument error: 42
iex> not 42
** (ArgumentError) argument error

Comparación
Elixir provee los operadores para comparar como otros lenguajes:

iex> 1 > 2
false
iex> 1 != 2
true
iex> 2 == 2
true
iex> 2 <= 3
true
Además provee la comparación estricta:  ===:

iex> 2 == 2.0
true
iex> 2 === 2.0
false

Una característica importante de Elixir es que cualquier dos tipos pueden ser comparados; Esto es particularmente útil en la clasificación. No necesitamos memorizar el orden de clasificación, pero es importante estar consciente de el

number < atom < reference < function < port < pid < tuple < map < list < bitstring
Esto puede llevar a algunas comparaciones interesantes, pero válidas, que no puede encontrar en otros Lenguajes:

iex> :hello > 999
true
iex> {:hello, :world} > [1, 2, 3]
false

String Interpolation
Si has usado Ruby o Scala, string interpolation en Elixir te va sonar familiar:

iex> name = "Sean"
iex> "Hello #{name}"
"Hello Sean"

String Concatenation
Para concatenar 2 cadenas utilizamos el operador <> :

iex> name = "Sean"
iex> "Hello " <> name
"Hello Sean"

Este es el primer post de algunos más que nos acerquen a este lenguaje.

Dejo link:



martes, 7 de marzo de 2017

Quien usa Elixir?

Cuando le cuento a alguien las ventajas de usar Elixir, lo primero que me preguntan es quien usa ese lenguaje.

Es decir porque todo el mundo use una rueda cuadrada, no quiere decir que esta bien, pero tengo que reconocer, que un lenguaje de programación tenga muchos programadores es una gran ventaja y además que compañías lo usen y creen frameworks, es muy interesante.

Por lo tanto no está mal pensar en quien usa Elixir, por lo tanto quiero compartir esta página que detalla todas las compañías que lo usan:


https://github.com/doomspork/elixir-companies

domingo, 5 de marzo de 2017

Pipe Operator de Elixir



Hice el curso try Elixir de codescholl y quede asombrado sobre el operador pipe o |> como les guste llamarlo.

Vamos por parte, si no conocen Elixir te recomiendo:
y si queres saber más sobre Elixir: http://emanuelpeg.blogspot.com.ar/search/label/Elixir

En programación funcional y en otros paradigmas también, es común que una función reciba como parámetros el resultado de otra función y así sucesivamente. Lo que nos queda:

foo(bar(baz(new_function(other_function(2)))))

Como pueden ver no es muy legible para estos casos tenemos el operador |> que funciona igual al operador pipe de linux, es decir permite que el resultado de una función sea el primer parámetro de una segunda función.

Por lo tanto nuestro ejemplo nos queda:

other_function(2) |> new_function() |> baz() |> bar() |> foo()

Veamos unos ejemplos: 

iex> "Elixir rocks" |> String.split
["Elixir", "rocks"]


iex> "Elixir rocks" |> String.upcase |> String.split
["ELIXIR", "ROCKS"]


iex> "elixir" |> String.ends_with?("ixir")
true

Dejo link: 

Google ofrece cursos gratuitos, con certificación y en español


Solamente quiero hacerme eco de esta noticia que lei en un blog.

El programa “Actívate” busca mejorar las competencias digitales de los usuarios como también de quienes manejan pequeñas y grandes empresas. Google en colaboración con universidades e instituciones de España ofrecen siete cursos gratuitos de manera online, estos van desde marketing hasta productividad personal. Todos los cursos cuentan con certificación.

Dejo link:
https://www.azulweb.net/google-ofrece-cursos-gratuitos-certificacion-espanol/?utm_campaign=arteprogra&utm_medium=facebook&utm_source=030317

sábado, 4 de marzo de 2017

Un resumen de Scala for the Impatient, parte 12

Zipping

Una de las razones para utilizar tuplas, es porque podemos procesar un conjunto de elementos de distinto tipo, todos juntos. Esto es común cuando utilizamos el método zip:

val symbols = Array("<", "-", ">")
val counts = Array(2, 10, 2)
val pairs = symbols.zip(counts)

y esto retornara pares de la siguiente forma:

Array(("<", 2), ("-", 10), (">", 2))

Luego estos pares se pueden procesar juntos:

for ((s, n) <- pairs) Console.print(s * n) // Prints <<---------->>

Algo que podemos hacer es luego pasar este par a un mapa con el método toMap :

keys.zip(values).toMap

Clases

Es hora de hablar de clases, para el que no esta muy interiorizado con la programación orientada a objetos, le recomiendo que lea algo de teoría de objetos antes de seguir.

Scala cuenta con una estructura para definir clases como java o c++. Pero un tanto más moderna y nos simplifica bastante las escritura.

class Counter {
  private var value = 0 // Se deben inicializar los valores
  def increment() { value += 1 } // Métodos por defecto son públicos
  def current() = value
}

En Scala no es necesario indicar que una clase es publicas. Un archivo puede contener muchas clases y estas son todas publicas.

Si queremos utilizar la clase declarada lo podemos hacer:

val myCounter = new Counter // o new Counter()
myCounter.increment()
println(myCounter.current)

Se pueden llamar los métodos sin parámetros con paréntesis o sin paréntesis:

myCounter.current // OK
myCounter.current() // también esta bien

Cual es la mejor forma? Por conversión se indica que se utilicen los paréntesis cuando el método modifica un valor, si es un simple método para acceder a un valor no es necesario. Como lo usamos anteriormente:

myCounter.increment() //modifica el valor
println(myCounter.current) // solo accede

Se puede forzar a no utilizar parentesis en los metodos de la siguiente manera:

class Counter {
def current = value // El metodo no es definido con ()
}

Ahora el método current debe ser usado sin parentesis

Propiedades getter y setters

En Java necesitamos declarar métodos que nos permitan acceder a nuestros atributos privados:

public class Person { // Esto es Java
  private int age = 0;
  public int getAge() { return age; }
  public void setAge(int age) { this.age = age; }
}

Porque es mejor esto que hacer publico age? Porque podemos indicar restricciones, por ejemplo si no queremos que la persona pueda ser más joven:

public void setAge(int newValue) { if (newValue > age) age = newValue; }

Como se puede ver es mucho mejor usar métodos getters y setters que hacer públicos los atributos de una clase.

Scala provee métodos getters y setters para los campos, aquí podemos ver una definición de un campo publico:

class Person {
  var age = 0
}

Scala genera una clase para la JVM con un atributo privado y métodos getter y setter públicos, si declaramos este atributo privado va a generar métodos getter y setter privados.

En scala los métodos son llamados age y age_= , de esta manera si hacemos:

println(fred.age) // Llama al metodo fred.age()
fred.age = 21 // Llama al metodo fred.age_=(21)

Esto es mucho mejor que tener atributos privados, porque podemos redefinir estos métodos:

class Person {
private var privateAge = 0 // hacemos privado a la edad y la renombramos.

def age = privateAge
def age_=(newValue: Int) {
if (newValue > privateAge) privateAge = newValue; // No puede ser más joven
}

Ahora podemos seguir accediendo a age pero no podemos rejuvenecer a una persona:

val fred = new Person
fred.age = 30
fred.age = 21
println(fred.age) // 30

Notemos que en Scala no tenemos la necesidad de saber si estamos accediendo a un método o a un atributo, de esta forma scala puede implementar este mecanismo.

Si esperamos tener una propiedad solo lectura, es decir que no se pueda modificar podemos utilizar la palabra val al declarar este atributo:

class Message {
  val timeStamp = new java.util.Date
  …
}

Como ya vimos anteriormente, en ciertos casos es necesario mantener un atributo que no sea modificable directamente:

class Counter {
   private var value = 0 // Se deben inicializar los valores
   def increment() { value += 1 } // Métodos por defecto son públicos
   def current = value
}



jueves, 2 de marzo de 2017

Quien usa scala??



Cuando le cuento a alguien las ventajas de usar scala, lo primero que me preguntan es quien usa ese lenguaje.

Es decir porque todo el mundo use una rueda cuadrada, no quiere decir que esta bien, pero tengo que reconocer, que un lenguaje de programación tenga muchos programadores es una gran ventaja y además que compañías lo usen y creen frameworks, es muy interesante.

Por lo tanto no esta mal pensar en quien usa scala, entre las empresas que lo usan podemos nombrar:

  • LinkedIn
  • Twitter
  • Foursquare
  • Netflix
  • Tumblr
  • The Guardian
  • precog
  • Sony
  • AirBnB
  • Klout
  • Apple (added Sep., 2013)
  • Meetup.com
  • Remember the Milk
  • The Swiss bank UBS
  • Ask.com
  • AT&T
  • Bloomberg
  • eBay
  • The Weather Channel
  • ValueClick
  • IBM
Y muchos más!!

Dejo link: 

martes, 28 de febrero de 2017

Zorin OS

Quede enganchado con Zorin OS, para el que no lo conoce es un linux muy elegante derivado de Ubuntu.

Uno de los objetivos de esta distribución es intentar, desde un primer momento, brindarle al usuario una interfaz gráfica amigable y similar a la de los sistemas Windows 7 y Windows XP, permitiendo además un determinado grado de compatibilidad con dichos sistemas mediante la utilización de WINE. Adicionalmente ofrece una serie de pequeñas herramientas propias que simplifican algunas configuraciones relacionadas, como por ejemplo, con la interfaz gráfica y/o elección del software. Veamos unos screenshots:





Ya lo estoy bajando y cuando lo pruebe, no va a faltar post.

Dejo link:
https://zorinos.com/

Big Data Analysis with Scala and Spark



Me llego el siguiente mail de la gente de coursera:

Hi there Pablo Emanuel Goette,
Just a short note to let you know that we're putting the final touches on Big Data Analysis with Scala and Spark, and we're officially set to go live on March 6th, 2017 – one week from today. Very excited to share this course material with you all!
Hang tight, just a few more days :-)
– Heather Miller
Go to course
facebooktwitterblogblog
You are receiving this email because emanuelpeg@yahoo.com.ar is registered to the
Big Data Analysis with Scala and Spark course at Coursera.
Please do not reply directly to this email. If you have any questions or feedback,
please visit our support site.
Copyright (c) 2016 Coursera, Inc | 381 E. Evelyn Avenue, Mountain View, CA 94041 USA
unsubscribe from this list


Es una gran oportunidad para aprender sobre big data con spark por lo tanto, a inscribirse:

https://www.coursera.org/learn/scala-spark-big-data


Un resumen de Scala for the Impatient, parte 11

Mapas Ordenados

Cuando se trabaja con un mapa, es necesario elegir una implementación: un hash o un árbol balanceado. De forma predeterminada, Scala le ofrece una tabla hash. Es posible que debamos usar  un mapa implementado con un árbol.
Scala tiene un mapa inmutable ordenado implementado con un árbol:

val scores = scala.collection.immutable.SortedMap("Alice" -> 10, "Fred" -> 7, "Bob" -> 3, "Cindy" -> 8)

Desafortunadamente en scala 2.9 no tiene un mapa mutable implementado con un árbol. Lo que podemos hacer es usar el TreeMap de java.

Podemos utilizar un mapa de Java y luego podemos convertirlo en un mapa de scala. Para convertir a un mapa de scala debemos importar : scala.collection.JavaConversions.mapAsScalaMap

Podemos cambiar tipo de mapa de la siguiente :

val scores: scala.collection.mutable.Map[String, Int] = new java.util.TreeMap[String, Int]

Además, puede obtener una conversión de java.util.Properties a un Map [String, String] :

import scala.collection.JavaConversions.propertiesAsScalaMap
val props: scala.collection.Map[String, String] = System.getProperties()

Por el contrario, para pasar un mapa Scala a un método que espera un mapa Java, proporcione la conversión implícita opuesta. Por ejemplo:

import scala.collection.JavaConversions.mapAsJavaMap
import java.awt.font.TextAttribute._ // Importar la librería
val attrs = Map(FAMILY -> "Serif", SIZE -> 12) // Un mapa de Scala
val font = new java.awt.Font(attrs) // Retorna un mapa Java

Tuplas

Un mapa esta formado por una clave/valor que básicamente es una tupla.
Una tupla son un conjunto de valores que pueden ser de diferente tipo:

(1, 3.14, "Fred")

Y el tipo de esta tupla es : Tuple3[Int, Double, java.lang.String] lo cual podemos escribir así: (Int, Double, java.lang.String) o podemos dejar que el tipo sea inferido:

val t = (1, 3.14, "Fred")

Podemos acceder a los valores por medio que los metodos _1, _2, _3 :

 val second = t._2 // Asigna 3.14 a second

A diferencia de los arreglos estos métodos comienzan con el _1 pero es más fácil usar pattern matching para asignar:

val (first, second, third) = t // Esto asigna a first el valor 1 y a second 2.14 y a third el valor “Fred”

Podemos utilizar el _ para los casos que no necesitamos guardar un valor en una variable:

val (first, second, _) = t

Las tuplas son útiles para funciones que retornan más de un valor. Por ejemplo partition de StringOps:

"New York".partition(_.isUpper) // retorna la tupla ("NY", "ew ork")

sábado, 25 de febrero de 2017

Un resumen de Scala for the Impatient, parte 10


Modificar Map

Para poder modificar datos de un map debemos utilizar un mapa mutable. Y lo podemos hacer de la siguiente manera:

scores("Bob") = 10
// Actualiza el valor de la key “Bob” asumiendo que esta existe.
scores("Fred") = 7
//Agrega una nueva key y valor (asumiendo que es un map mutable)

Alternativamente podemos utilizar el operador += para modificar y agregar valores de forma masiva:
scores += ("Bob" -> 10, "Fred" -> 7)
Podemos remover una key con el operador -=
scores -= "Alice"

No se puede modificar mapas inmutables (de hay lo de inmutable) pero podemos crear nuevos mapas con diferentes valores:

val newScores = scores + ("Bob" -> 10, "Fred" -> 7) // Nuevo mapa con valores modificados

Ahora obtenemos un nuevo mapa llamado newScore con el valor de “Bob” modificado y “Fred” agregado.

De la misma manera podemos utilizar este operador para un mapa mutable:

var scores = ...
scores = scores + ("Bob" -> 10, "Fred" -> 7)

De igual forma podemos remover valores con el - :
scores = scores – "Alice"

Se podría pensar que es ineficiente construir nuevos mapas por operador, pero esto no es así. Dado que los mapas antiguos y nuevos comparten la mayor parte de su estructura. (Esto es posible porque son inmutables.)

Iterando sobre los mapas

Iterar sobre todos los pares clave / valor de un mapa es fácil, podemos utilizar el bucle for:
for ((k, v) <- map) process k and v

La magia aquí esta en el uso de pattern matching usado en el bloque for. Luego vamos a hablar de pattern matching, no se preocupen. De este modo obtenemos la clave y el valor en cada iteración.

Si necesitamos solamente iterar por Key, podemos utilizar el método KeySet de java o values para iterar por valor:

scores.keySet // retorna un set con las claves:  Set("Bob", "Cindy", "Fred", "Alice")
for (v <- scores.values) println(v) // Imprime los valores.

Por supuesto podemos utilizar esta técnicas con lo antes aprendido, si por ejemplo deseamos retornar un mapa donde su valor sea la clave del anterior:

for ((k, v) <- map) yield (v, k)

martes, 21 de febrero de 2017

Gogland, la ide para Go


Efectivamente Go se viene con todo y la gente de Jetbrains (que es muy inteligente) hizo una ide para este lenguaje.

La IDE es gratuita, la acabo de bajar. El nuevo entorno solamente puede probarse a través de un programa de acceso temprano (early access program – EAP), pero esto es por el momento. Más adelante debería ser un producto terminado, dependiendo de como se reciba el producto.

Gogland ofrece lo mismo que un IDE de Jetbrains por lo tanto contamos con : análisis del código, navegación rápida, análisis de errores, formateo, refactoreo, debug, etc.

Dejo link: https://www.jetbrains.com/go/

Try Elixir

Codeschool nos regala otro curto al modo de try como ya lo conocemos, sin más:

Try Elixir

Begin learning the basics of Elixir and take your first steps into the world of functional programming.
 Coming Soon - We'll remind you.

Course Overview

  1. Level 1 on Try Elixir

    LEVEL 1 FREE LEVEL 1 Video | 4 Challenges
    Modules & Functions

    Get started in the world of functional programming with Elixir by learning how to work with named functions.
  2. Level 2 on Try Elixir

    LEVEL 2 FREE LEVEL 1 Video | 2 Challenges
    The Pipe Operator

    Learn how to refactor nested function calls into an easier syntax, using the pipe operator.
  3. Level 3 on Try Elixir

    LEVEL 3 FREE LEVEL 1 Video | 4 Challenges
    Pattern Matching

    Explore how pattern matching works and how we can use it to remove if statements from our programs.
Try Elixir
COMPLETE THESE LEVELS TO UNLOCK

Course Completion Badge

Begin learning the basics of Elixir and take your first steps into the world of functional programming.

Supplemental Learning



    Dejo link:
    https://www.codeschool.com/courses/try-elixir?utm_source=facebook&utm_medium=social

    domingo, 19 de febrero de 2017

    viernes, 17 de febrero de 2017

    Un resumen de Scala for the Impatient, parte 9

    Interoperabilidad con Java

    Los arreglos de scala fueron implementados como los arreglos de java por lo tanto podemos pasar de uno a otro.

    Si necesitamos llamar a un método java que retorna un java.util.List podemos hacerlo y utilizar java.util.ArrayList. Pero es mejor utilizar colecciones de scala, por lo tanto podemos utilizar una convercion implicita, importando scala.collection.JavaConversions luego podemos utilizar ArrayBuffer de scala.

    Por ejemplo java.lang.ProcessBuilder necesita una lista de parametros de tipo List<String> por lo tanto podemos hacer lo siguiente:

    import scala.collection.JavaConversions.bufferAsJavaList
    import scala.collection.mutable.ArrayBuffer

    val command = ArrayBuffer("ls", "-al", "/home/cay")
    val pb = new ProcessBuilder(command) // Scala a Java

    De igual manera podemos pasar de una lista de Java a un buffer de Scala:

    import scala.collection.JavaConversions.asScalaBuffer
    import scala.collection.mutable.Buffer

    val cmd : Buffer[String] = pb.command() // Java to Scala

    Construyendo un mapa

    Empecemos por el principio un mapa es una estructura que permite acceder a elementos por medio de una llave o key. Por lo tanto debemos insertar tanto el valor como la key.

    Podemos crear un mapa de forma declarativa:

    val scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)

    De esta forma se creea un mapa inmutable. Si esperamos hacer un map mutable debemos hacerlo de la siguiente manera:

    val scores = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)

    Si necesitamos iniciar un mapa vacio, debemos indicar el tipo:

    val scores = new scala.collection.mutable.HashMap[String, Int]

    En Scala un map no es mas que una colección de pares. El operador -> crea los pares. Por ejemplo:

    "Alice" -> 10 es ("Alice", 10)

    Por lo tanto podemos definir un mapa de la siguiente manera:

    val scores = Map(("Alice", 10), ("Bob", 3), ("Cindy", 8))
    El operador -> es un poco amigable que los paréntesis.

    Acceder a los valores del mapa: 

    En Scala podemos acceder a los valores con los parentesis:

    val bobsScore = scores("Bob") // Como scores.get("Bob") en Java

    Si el mapa no contiene el valor para una key, se lanza una excepción.

    val bobsScore = if (scores.contains("Bob")) scores("Bob") else 0

    Podemos utilizar la función getOrElse para hacer algo similar:

    val bobsScore = scores.getOrElse("Bob", 0)

    Por ultimo podemos acceder al elemento por medio del método get que retorna un Option objeto que puede ser Some o None. Que vamos a explicarlo más adelante.