Trilhas
/
Crystal
Crystal
/
Exercícios
/
Jantar no castelo
Jantar no castelo

Jantar no castelo

Exercício de aprendizagem

Introdução

O Crystal tem um tipo chamado Nil, que só pode ter um valor: nil. Ele é usado para representar a ausência de um valor e é parecido com null ou None em outras linguagens.

Valores nil podem ser retornados por vários métodos, por exemplo String#[]?, que retorna nil se o índice estiver fora dos limites.

"foo"[10]? # => nil

O Crystal tem o que se conhece como verificações de referência nula, o que significa que, por padrão, nenhum tipo pode ser nil. Isso quer dizer que você não pode atribuir nil a uma variável, a menos que a declare explicitamente como um tipo Nil. Por sua vez, isso significa que o compilador vai verificar automaticamente as referências nulas.

Valor falso

Existem algumas abordagens para lidar com valores nil. nil é um valor falso, assim como false. Isso significa que, em instruções e em outros lugares onde se espera um valor falso ou verdadeiro, ele será tratado da mesma forma que false.

if nil
  puts "nil is truthy"
else
  puts "nil is falsey"
end

# => nil is falsey

Isso significa que, se uma variável que pode ser nil tiver o valor nil, o bloco do caso verdadeiro não será executado.

foo = "boo"[2]? # It is possible that foo is nil
if foo
  p foo.class # => Char
end

Verificar se é nil

O Crystal tem um método que pode ser usado para verificar se um valor é nil. Ele se chama nil? e está disponível em todos os objetos.

foo = "boo"[2]?
if foo.nil?
  puts "foo is nil"
else
  puts "foo is not nil"
end

Isso é um pouco diferente de simplesmente usar o valor em uma condicional, já que nos últimos exemplos tanto false quanto nil seriam tratados como falso. Aqui, só nil é tratado como falso, pois, se fosse false, não seria nil e, com isso, seria verdadeiro.

Operador ou

A maneira mais fácil de lidar com valores nil é garantir que eles nunca se tornem nil desde o início. O operador ou (||) costuma ser usado para lidar com Bools, mas, se bem compreendido, também pode ser usado para lidar com valores nil. O operador ou verifica se o primeiro valor é verdadeiro; se não for, o segundo valor é usado. Isso pode ser usado para que, se o valor for nil, ele seja falso e, com isso, o segundo valor seja usado.

"foo"[10]? || "bar" # => "bar"

Instruções

Vossa majestade está dando um jantar na capital da União de Kalmar, Copenhague. É a maior festa do ano e todos os nobres estão convidados. Mas estão se espalhando rumores pelo país de que há um plano para envenenar Vossa Majestade.

Vossa majestade pediu a você, responsável por encontrar venenos na corte, que descubra se alguma comida ou bebida está envenenada. Vossa majestade planeja servir apenas Mushroom pasties como comida, mas, para beber, há uma variedade de bebidas.

1. Verifique se a comida está correta

Há uma grande chance de a comida estar envenenada se não for o que Vossa majestade pediu. Se a comida não for o que Vossa majestade pediu, ela deve ser descartada.

Implemente o método check_food?, que recebe o argumento food, que contém o nome da comida como uma String. O método deve retornar a comida se ela for Mushroom pasties; caso contrário, deve retornar nil.

CastleDinner.check_food?("Mushroom pasties")
# => "Mushroom pasties"

CastleDinner.check_food?("Bread")
# => nil

2. Verifique se a bebida está envenenada

É possível que a bebida esteja envenenada, mas é um pouco mais difícil dizer se está. A bebida está envenenada se ela não incluir a letra i no nome, não importa se a letra está em maiúscula ou minúscula. A bebida deve ser descartada se estiver envenenada.

Implemente o método check_drink?, que recebe o argumento drink, que contém o nome da bebida como uma String. O método deve retornar a bebida se ela não estiver envenenada; caso contrário, deve retornar nil.

CastleDinner.check_drink?("Apple juice")
# => "Apple juice"

CastleDinner.check_drink?("Tea")
# => nil

3. Substitua a bebida

Vossa majestade não ia querer deixar os convidados preocupados com veneno na comida. Portanto, se a bebida estiver envenenada, ela deve ser trocada por uma nova bebida, especificamente Apple juice.

Implemente o método replace_drink, que recebe o argumento drink, que contém o nome da bebida como uma String. O método deve retornar a bebida se ela não estiver envenenada; caso contrário, deve retornar "Apple juice".

CastleDinner.replace_drink("Orange juice")
# => "Orange juice"

CastleDinner.replace_drink("Tea")
# => "Apple juice"
Editar via GitHub O link abre em uma nova janela ou aba
Crystal Exercism

Tudo pronto para começar Jantar no castelo?

Crie sua conta no Exercism para aprender e dominar Crystal com 26 conceitos142 exercícios e mentoria humana de verdade, tudo de graça.