Rutas
/
Crystal
Crystal
/
Ejercicios
/
Cena en el castillo
Cena en el castillo

Cena en el castillo

Ejercicio de aprendizaje

Introducción

Crystal tiene un tipo llamado Nil, que solo puede tener un valor: nil. Se usa para representar la ausencia de un valor y es similar a null o None en otros lenguajes.

Los valores Nil pueden ser devueltos por varios métodos, por ejemplo String#[]?, que devuelve nil si el índice está fuera de los límites.

"foo"[10]? # => nil

Crystal tiene lo que se conoce como COMPROBACIONES DE REFERENCIAS NULAS, lo que significa que, por defecto, ningún tipo admite nil. Esto quiere decir que no puedes asignar nil a una variable a menos que la declares explícitamente como de tipo Nil. A su vez, esto significa que el compilador comprobará automáticamente si hay referencias nulas.

Valor falso

Se pueden seguir varias estrategias para tratar los valores nil. nil es un valor falso, al igual que false. Esto significa que, en las instrucciones y en otros lugares donde se espera un valor verdadero o falso, se tratará igual que false.

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

# => nil is falsey

Esto significa que no se tomará la rama verdadera si una variable que admite nil tiene el valor nil.

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

Comprobar si es nil

Crystal tiene un método que se puede usar para comprobar si un valor es nil. Se llama nil? y está disponible en todos los objetos.

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

Esto es un poco distinto cuando se usa el valor directamente en un condicional, ya que en los ejemplos anteriores tanto false como nil se trataban como falsos. Aquí solo nil se trata como falso, porque si hubiera sido false no habría sido nil y, por tanto, habría sido verdadero.

El operador o

La forma más sencilla de tratar con valores nil es asegurarse de que nunca lleguen a ser nil. El operador o (||) se usa a menudo cuando se trabaja con Bools, pero, si se entiende bien, también se puede usar para tratar con valores nil. El operador o comprueba si el primer valor es verdadero; si no lo es, se usa el segundo valor. Esto se puede usar para conseguir que, si el valor es nil, sea falso y, por tanto, se use el segundo valor.

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

Instrucciones

Su Majestad organiza una cena en Copenhague, la capital de la Unión de Kalmar. Es la fiesta más grande del año y todos los nobles están invitados. Pero se están extendiendo rumores por todo el país de que hay una conspiración para envenenar a Su Majestad.

Su Majestad te ha pedido a ti, el buscador real de venenos, que averigües si alguna comida o bebida está envenenada. Su Majestad tiene previsto servir solo Mushroom pasties como comida, pero en cuanto a las bebidas, hay una gran variedad.

1. Comprueba si la comida es correcta

Hay muchas probabilidades de que la comida esté envenenada si no es la que Su Majestad ha pedido. Si la comida no es la que Su Majestad ha pedido, hay que desecharla.

Implementa el método check_food?, que recibe el argumento food, que contiene el nombre de la comida como String. El método debe devolver la comida si es Mushroom pasties; de lo contrario, debe devolver nil.

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

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

2. Comprueba si la bebida está envenenada

Es posible que la bebida esté envenenada, pero es un poco más difícil saberlo. La bebida está envenenada si no incluye la letra i en el nombre, sin importar las mayúsculas y minúsculas. Hay que desechar la bebida si está envenenada.

Implementa el método check_drink?, que recibe el argumento drink, que contiene el nombre de la bebida como String. El método debe devolver la bebida si no está envenenada; de lo contrario, debe devolver nil.

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

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

3. Sustituye la bebida

Su Majestad no querría preocupar a sus invitados por el veneno en la comida. Por lo tanto, si la bebida está envenenada, hay que sustituirla por otra, concretamente Apple juice.

Implementa el método replace_drink, que recibe el argumento drink, que contiene el nombre de la bebida como String. El método debe devolver la bebida si no está envenenada; de lo contrario, debe devolver "Apple juice".

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

CastleDinner.replace_drink("Tea")
# => "Apple juice"
Editar en GitHub El enlace se abre en una ventana o pestaña nueva
Crystal Exercism

¿Listo para empezar Cena en el castillo?

Regístrate en Exercism para aprender y dominar Crystal con 26 conceptos142 ejercicios y mentoría humana real, todo gratis.