Los símbolos son identificadores con nombre que se pueden usar para referirse a un valor.
Los símbolos se crean mediante un literal de símbolo, que consiste en poner el prefijo : delante de un nombre, por ejemplo :foo.
También se pueden escribir entre comillas, por ejemplo :"foo", lo que permite, por ejemplo, espacios en el nombre.
:foo # => :foo
:"foo boo" # => :"foo boo"
Los símbolos se usan en muchos sitios del lenguaje, por ejemplo como claves en los hashes, para representar nombres de métodos y nombres de variables.
Lo que diferencia a los símbolos de los strings es que son identificadores y no representan datos ni texto. Esto significa que dos símbolos con el mismo nombre son siempre el mismo objeto.
"foo".object_id # => 60
"foo".object_id # => 80
:foo.object_id # => 1086748
:foo.object_id # => 1086748
Los símbolos son inmutables, lo que significa que no se pueden modificar. Esto significa que cuando «modificas» un símbolo, en realidad estás creando un símbolo nuevo. Hay varios métodos que se pueden usar para manipular símbolos y todos ellos devuelven símbolos nuevos. Todos los métodos se pueden encontrar en la API de Symbol.
:foo.upcase # => :FOO
:foo.object_id # => 1086748
:foo.upcase.object_id # => 60
Que los símbolos sean inmutables tiene la ventaja de que son más eficientes en memoria que los strings, pero también de que son más seguros de usar como identificadores.
Los símbolos se pueden convertir en strings y viceversa.
Esto puede ser útil cuando quieres modificar un símbolo o cuando quieres usar un símbolo como string.
Para presentar un string como símbolo, puedes usar el método String#to_sym, y para hacer lo contrario, puedes usar el método Symbol#to_s.
Dado que los símbolos tienen un conjunto limitado de métodos, puede ser útil convertir un símbolo en string para usar métodos de string sobre él, si se necesita un símbolo nuevo.
:foo.to_s # => "foo"
"foo".to_sym # => :foo
El puerto de Palermo es un puerto ajetreado, con muchos barcos entrando y saliendo. Desde hace mucho tiempo cuenta con un sistema manual para llevar el control de los barcos que hay actualmente en el puerto. Este sistema es muy propenso a errores, y el jefe del puerto ha decidido sustituirlo por un sistema informatizado.
El jefe del puerto te ha contratado para implementar el nuevo sistema. El sistema tiene que gestionar identificadores de barcos, pero también de destinos.
Lo primero que tienes que hacer es crear el identificador del puerto de Palermo. El identificador son las cuatro primeras letras del nombre del puerto, en mayúsculas.
Define la constante Port::IDENTIFIER como un símbolo con el valor :PALE.
Port::IDENTIFIER
# => :PALE
El programa también tendrá que gestionar otros puertos, así que necesitas crear identificadores para ellos también. Al puerto le gustaría que el sistema estuviera automatizado y, dado que los puertos usan convenciones de nombres distintas, los identificadores deben generarse a partir del nombre del puerto. El identificador son las cuatro primeras letras del nombre del puerto, en mayúsculas.
Define el método Port.get_identifier para que reciba un string como argumento y devuelva el identificador como símbolo para ese puerto.
Port.get_identifier("Hamburg")
# => :HAMB
El puerto tiene dos terminales y el sistema necesita determinar en qué terminal debe atracar un barco. La terminal viene determinada por el identificador del barco.
El identificador se compone de 2 partes: la primera son 3 letras en mayúscula que indican qué carga transporta el barco, y después 3 números, que son el identificador único del barco.
Si el identificador del barco indica OIL o GAS, el barco debe atracar en la terminal A. En caso contrario, el barco debe atracar en la terminal B.
Define el método Port.get_terminal para que reciba un símbolo como argumento, que es el identificador del barco.
El método debe devolver la terminal como símbolo.
Port.get_terminal(:OIL123)
# => :A
Regístrate en Exercism para aprender y dominar Ruby con 21 conceptos121 ejercicios y mentoría humana real, todo gratis.