Os símbolos são identificadores nomeados que podem ser usados para fazer referência a um valor.
Os símbolos são criados através de um literal de símbolo, que consiste em colocar o caráter : antes de um nome, por exemplo :foo.
Também podem ser escritos com aspas, por exemplo :"foo", o que permite, por exemplo, espaços no nome.
:foo # => :foo
:"foo boo" # => :"foo boo"
Os símbolos são usados em muitos locais da linguagem, incluindo como chaves em hashes, para representar nomes de métodos e de variáveis.
O que distingue os símbolos das strings é que são identificadores e não representam dados nem texto. Isto significa que dois símbolos com o mesmo nome são sempre o mesmo objeto.
"foo".object_id # => 60
"foo".object_id # => 80
:foo.object_id # => 1086748
:foo.object_id # => 1086748
Os símbolos são imutáveis, o que significa que não podem ser modificados. Isto significa que, quando "modificas" um símbolo, estás na verdade a criar um novo símbolo. Existem alguns métodos que podem ser usados para manipular símbolos; todos devolvem novos símbolos. Todos os métodos podem ser encontrados na API do Symbol.
:foo.upcase # => :FOO
:foo.object_id # => 1086748
:foo.upcase.object_id # => 60
A vantagem de os símbolos serem imutáveis é que são mais eficientes em termos de memória do que as strings, mas também mais seguros para usar como identificadores.
Os símbolos podem ser convertidos em strings e vice-versa.
Isto pode ser útil quando queres modificar um símbolo ou quando queres usar um símbolo como string.
Para apresentar uma string como símbolo, podes usar o método String#to_sym; para fazer o contrário, podes usar o método Symbol#to_s.
Como os símbolos têm um conjunto limitado de métodos, pode ser útil converter um símbolo numa string para lhe aplicar métodos de string, se precisares de um novo símbolo.
:foo.to_s # => "foo"
"foo".to_sym # => :foo
O porto de Palermo é um porto movimentado, com muitos navios a chegar e a partir. Há muito tempo que tem um sistema manual para registar os navios que estão atualmente no porto. Este sistema é muito propício a erros, e o chefe do porto decidiu substituí-lo por um sistema informatizado.
O chefe do porto contratou-te para implementares o novo sistema. O sistema tem de tratar identificadores de navios, mas também de destinos.
A primeira coisa que tens de fazer é criar o identificador do porto de Palermo. O identificador é composto pelas primeiras quatro letras do nome do porto, em maiúsculas.
Define a constante Port::IDENTIFIER como um símbolo com o valor :PALE.
Port::IDENTIFIER
# => :PALE
O programa também terá de tratar outros portos, por isso tens de criar identificadores para eles também. O porto gostaria que o sistema fosse automatizado e, como os portos usam convenções de nomenclatura diferentes, os identificadores devem ser gerados a partir do nome do porto. O identificador é composto pelas primeiras quatro letras do nome do porto, em maiúsculas.
Define o método Port.get_identifier para receber uma string como argumento e devolver o identificador desse porto como símbolo.
Port.get_identifier("Hamburg")
# => :HAMB
O porto tem dois terminais e o sistema tem de determinar em que terminal um navio deve atracar. O terminal é determinado pelo identificador do navio.
O identificador é composto por 2 partes: a primeira é formada por 3 letras maiúsculas que indicam que carga o navio transporta, e depois 3 números, que são o identificador único do navio.
Se o identificador do navio indicar OIL ou GAS, o navio deve atracar no terminal A. Caso contrário, o navio deve atracar no terminal B.
Define o método Port.get_terminal para receber como argumento um símbolo que é o identificador do navio.
O método deve devolver o terminal como símbolo.
Port.get_terminal(:OIL123)
# => :A
Inscreve-te no Exercism para aprenderes e dominares Ruby com 21 conceitos121 exercícios, e mentoria humana real, tudo grátis.