51 votes

Ruby Koan 151 levant des exceptions

Je traverse les koans rubis, je suis sur 151 et je viens de frapper un mur de briques.

Voici le koan:

 # You need to write the triangle method in the file 'triangle.rb'
require 'triangle.rb'

class AboutTriangleProject2 < EdgeCase::Koan
  # The first assignment did not talk about how to handle errors.
  # Let's handle that part now.
  def test_illegal_triangles_throw_exceptions
    assert_raise(TriangleError) do triangle(0, 0, 0) end
    assert_raise(TriangleError) do triangle(3, 4, -5) end
    assert_raise(TriangleError) do triangle(1, 1, 3) end
    assert_raise(TriangleError) do triangle(2, 4, 2) end
 end
end
 

Alors dans triangle.rb nous avons:

 def triangle(a, b, c)
  # WRITE THIS CODE
  if a==b && a==c
    return :equilateral
  end
  if (a==b && a!=c) || (a==c && a!=b) || (b==c && b!=a)
    return :isosceles
  end
  if a!=b && a!=c && b!=c
    return :scalene
  end
  if a==0 && b==0 && c==0
    raise new.TriangleError
  end



end

# Error class used in part 2.  No need to change this code.
class TriangleError < StandardError

end
 

Je suis plus que confus - toute aide serait très appréciée!

EDIT: Pour compléter ce koan, je dois mettre quelque chose dans la classe TriangleError - mais je ne sais pas quoi

MISE À JOUR: Voici ce que dit le karma koan:

 <TriangleError> exception expected but none was thrown.
 

58voto

cHao Points 42294
  1. Un triangle ne devriez pas avoir des côtés de longueur égale à 0. Si elle le fait, c'est soit un segment de ligne ou d'un point, en fonction du nombre de côtés sont égales à 0.
  2. Longueur négative n'a pas de sens.
  3. Deux des côtés d'un triangle doit ajouter jusqu'à plus de la troisième côté.
  4. Voir 3, et de se concentrer sur le "plus".

Vous ne devriez pas avoir à modifier le TriangleError code, AFAICS. On dirait que votre syntaxe est juste un peu loufoque. Essayez de changer

raise new.TriangleError

pour

raise TriangleError, "why the exception happened"

Aussi, vous devriez être en testant les valeurs (et de lever des exceptions) avant de faire quoi que ce soit avec eux. Déplacer l'exception des trucs au début de la fonction.

35voto

Sergey Zhizhin Points 388

Vous avez oublié le cas où a, b ou c sont négatifs:

 def triangle(a, b, c)
  raise TriangleError if [a,b,c].min <= 0
  x, y, z = [a,b,c].sort
  raise TriangleError if x + y <= z
  [:equilateral,:isosceles,:scalene].fetch([a,b,c].uniq.size - 1)
end
 

16voto

Leon Fedotov Points 719

J'ai fini par faire ceci:

 def triangle(a, b, c)
  a, b, c = [a, b, c].sort
  raise TriangleError if a <= 0 || a + b <= c
  [nil, :equilateral, :isosceles, :scalene][[a, b, c].uniq.size]
end
 

Merci aux commentateurs ici :)

9voto

Matt Connolly Points 4851

J'aime la réponse de Cory. Mais je me demande s'il y a une raison ou quelque chose à gagner à avoir quatre tests, alors que vous pourriez en avoir deux:

 raise TriangleError, "Sides must by numbers greater than zero" if (a <= 0) || (b <= 0) || (c <= 0)
raise TriangleError, "No two sides can add to be less than or equal to the other side" if (a+b <= c) || (a+c <= b) || (b+c <= a)
 

9voto

tomblomfield Points 393

Vous n'avez pas besoin de modifier l'exception. Quelque chose comme ça devrait marcher;

 def triangle(*args)
  args.sort!
  raise TriangleError if args[0] + args[1] <= args[2] || args[0] <= 0
  [nil, :equilateral, :isosceles, :scalene][args.uniq.length]
end
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X