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 se forma al anteponer un : a 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 lugares del lenguaje, incluso como claves en hashes, para representar nombres de métodos y nombres de variables.
Lo que hace que los símbolos sean diferentes 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 algunos métodos que se pueden usar para manipular símbolos, y todos 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
La ventaja de que los símbolos sean inmutables es que son más eficientes en memoria que los strings, pero también más seguros de usar como identificadores.
Los símbolos se pueden convertir a strings y viceversa.
Esto puede ser útil cuando quieres modificar un símbolo, o cuando quieres usar un símbolo como un string.
Para presentar un string como un símbolo, puedes usar el método String#to_sym, y para hacer lo contrario, puedes usar el método Symbol#to_s.
Debido a que los símbolos tienen un conjunto limitado de métodos, puede ser útil convertir un símbolo a un 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 muy concurrido, con muchos barcos que entran y salen. Durante mucho tiempo ha tenido un sistema manual para llevar un registro de los barcos que están actualmente en el puerto. Este sistema es muy propenso a errores, y el jefe del puerto ha decidido reemplazarlo por un sistema computarizado.
El jefe del puerto te ha contratado para implementar el nuevo sistema. El sistema debe manejar identificadores para los barcos, pero también para los destinos.
Lo primero que debes hacer es crear el identificador del puerto de Palermo. El identificador se forma con las primeras cuatro 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 manejar otros puertos, así que necesitas crear identificadores para ellos también. Al puerto le gustaría que el sistema fuera automatizado y, como los puertos usan diferentes convenciones de nombres, los identificadores deben generarse a partir del nombre del puerto. El identificador se forma con las primeras cuatro 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 de ese puerto como un símbolo.
Port.get_identifier("Hamburg")
# => :HAMB
El puerto tiene dos terminales, y el sistema necesita determinar en qué terminal debe atracar un barco. La terminal se determina por el identificador del barco.
El identificador se compone de 2 partes: la primera son 3 letras en mayúsculas que indican qué carga transporta el barco, y luego 3 números que son el identificador único del barco.
Si el barco transporta OIL o GAS, debe atracar en la terminal A. De lo contrario, debe atracar en la terminal B.
Define el método Port.get_terminal para que reciba como argumento un símbolo que sea el identificador del barco.
El método debe devolver la terminal como un 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.