O Crystal tem um tipo chamado Nil, que só pode ter um valor: nil.
É usado para representar a ausência de um valor e é semelhante ao null ou ao None de outras linguagens.
Os valores nil podem ser devolvidos por vários métodos, por exemplo String#[]?, que devolve nil se o índice estiver fora dos limites.
"foo"[10]? # => nil
O Crystal tem aquilo a que se chama NULL REFERENCE CHECKS, o que significa que, por predefinição, nenhum dos tipos pode ser nil.
Isto significa que não podes atribuir nil a uma variável, a menos que a declares explicitamente como sendo do tipo Nil.
Por sua vez, isto significa que o compilador verifica automaticamente as referências nulas.
Podes adotar várias abordagens para lidar com valores nil.
O nil é um valor falsey, tal como o false.
Isto significa que, em instruções e noutros locais onde se espera um valor falsey ou truthy, será tratado da mesma forma que o false.
if nil
puts "nil is truthy"
else
puts "nil is falsey"
end
# => nil is falsey
Isto significa que o ramo truthy não será seguido se uma variável que pode ser nil tiver o valor nil.
foo = "boo"[2]? # It is possible that foo is nil
if foo
p foo.class # => Char
end
O Crystal tem um método que podes usar para verificar se um valor é nil.
Chama-se 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
Isto é um pouco diferente de usar apenas o valor numa condicional, porque nos últimos exemplos tanto o false como o nil eram tratados como falso.
Aqui, só o nil é tratado como falsey, porque se fosse false já não seria nil e, portanto, seria truthy.
A forma mais fácil de lidar com valores nil é garantir que nunca chegam a ser nil.
O operador or (||) é frequentemente usado quando se trabalha com Bools, mas, bem entendido, também pode ser usado para lidar com valores nil.
O operador or verifica se o primeiro valor é truthy; se não for, é usado o segundo valor.
Isto permite fazer com que, se o valor for nil, seja falsey e, por isso, seja usado o segundo valor.
"foo"[10]? || "bar" # => "bar"
Vossa Majestade está a organizar um jantar na capital da União de Kalmar, Copenhaga. É a maior festa do ano e todos os nobres estão convidados. Mas espalham-se rumores pelo país de que há um plano para envenenar Vossa Majestade.
Sua Majestade pediu-te, a ti, detetor de venenos real, que descobrisses se alguma comida ou bebida está envenenada. Sua Majestade planeia servir apenas Mushroom pasties como comida, mas para beber há uma variedade de bebidas.
Há uma grande probabilidade de a comida estar envenenada se não for o que Sua Majestade encomendou. Se a comida não for o que Sua Majestade encomendou, deve ser deitada fora.
Implementa o método check_food?, que recebe o argumento food, que contém o nome da comida como uma String.
O método deve devolver a comida se for Mushroom pasties; caso contrário, deve devolver nil.
CastleDinner.check_food?("Mushroom pasties")
# => "Mushroom pasties"
CastleDinner.check_food?("Bread")
# => nil
É possível que a bebida esteja envenenada, mas é um pouco mais difícil de saber.
A bebida está envenenada se não incluir a letra i no nome, não importa se está em maiúscula ou minúscula.
A bebida deve ser deitada fora se estiver envenenada.
Implementa o método check_drink?, que recebe o argumento drink, que contém o nome da bebida como uma String.
O método deve devolver a bebida se não estiver envenenada; caso contrário, deve devolver nil.
CastleDinner.check_drink?("Apple juice")
# => "Apple juice"
CastleDinner.check_drink?("Tea")
# => nil
Vossa Majestade não quer deixar os convidados preocupados com veneno na comida. Por isso, se a bebida estiver envenenada, deve ser substituída por uma nova bebida, mais concretamente Apple juice.
Implementa o método replace_drink, que recebe o argumento drink, que contém o nome da bebida como uma String.
O método deve devolver a bebida se não estiver envenenada; caso contrário, deve devolver "Apple juice".
CastleDinner.replace_drink("Orange juice")
# => "Orange juice"
CastleDinner.replace_drink("Tea")
# => "Apple juice"
Inscreve-te no Exercism para aprenderes e dominares Crystal com 26 conceitos142 exercícios, e mentoria humana real, tudo grátis.