Percursos
/
Ruby
Ruby
/
Exercícios
/
Porto de Palermo
Porto de Palermo

Porto de Palermo

Exercício de aprendizagem

Introdução

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.

Identificador

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

Modificar símbolos

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.

Conversão

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

Instruções

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.

1. Cria o identificador dos portos

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

2. Obtém identificadores para outros portos

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

3. Determina em que terminal um navio deve atracar

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
Editar via GitHub A ligação abre numa nova janela ou separador
Ruby Exercism

Estás pronto para começar Porto de Palermo?

Inscreve-te no Exercism para aprenderes e dominares Ruby com 21 conceitos121 exercícios, e mentoria humana real, tudo grátis.