Ruby Koan 151 поднимает исключения - PullRequest
45 голосов
/ 30 сентября 2010

Я прохожу рубиновые коаны, я на 151, и я просто ударился о кирпичную стену.

Вот этот коан:

# 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

Затем в triangle.rbу нас есть:

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

Я не в замешательстве - любая помощь будет высоко ценится!

РЕДАКТИРОВАТЬ: Чтобы завершить этот коан, мне нужно поместить что-то в класс TriangleError - ноЯ понятия не имею, что

ОБНОВЛЕНИЕ: Вот что говорит вещь о кар-каре:

<TriangleError> exception expected but none was thrown.

Ответы [ 36 ]

2 голосов
/ 30 января 2012

Я получил этот код:

def triangle(a, b, c)
    raise TriangleError, "impossible triangle" if [a,b,c].min <= 0
    x, y, z = [a,b,c].sort
    raise TriangleError, "no two sides can be < than the third" if x + y <= z

    if a == b && b == c # && a == c # XXX: last check implied by previous 2
        :equilateral
    elsif a == b || b == c || c == a
        :isosceles
    else
        :scalene
    end
end 

Мне не нравится второе условие / повышение, но я не уверен, как его еще улучшить.

2 голосов
/ 14 сентября 2012

Фактически в следующем коде условие a <= 0 является избыточным.a + b всегда будет меньше, чем c, если a <0, и мы знаем, что b <c </p>

    raise TriangleError if a <= 0 || a + b <= c
2 голосов
/ 19 марта 2012

Вы также можете попробовать создать исключение с помощью:

raise TriangleError.new("All sides must be greater than 0") if a * b * c <= 0
1 голос
/ 23 февраля 2011

Вот что я написал, и все работало нормально.

def triangle(a, b, c)
  # WRITE THIS CODE
  raise TriangleError, "Sides have to be greater than zero" if (a == 0) | (b == 0) | (c == 0)
  raise TriangleError, "Sides have to be a postive number" if (a < 0) | (b < 0) | (c < 0)
  raise TriangleError, "Two sides can never be less than the sum of one side" if ((a + b) < c) | ((a + c) < b) | ((b + c) < a)
  raise TriangleError, "Two sides can never be equal one side" if ((a + b) ==  c) | ((a + c) ==  b) | ((b + c) ==  a)
  return :equilateral if (a == b) & (a == c) & (b == c)
  return :isosceles if (a == b) | (a == c) | (b == c)
  return :scalene

end

# Error class used in part 2.  No need to change this code.
class TriangleError < StandardError
end
1 голос
/ 08 августа 2012

Это то, чем я закончил.Это своего рода комбинация нескольких приведенных выше примеров с моим собственным уникальным подходом к исключению неравенства треугольника (оно учитывает и вырожденный случай).Кажется, работает.

def triangle(a, b, c)

  raise TriangleError if [a,b,c].min <= 0 
  raise TriangleError if [a,b,c].sort.reverse.reduce(:-) >= 0

  return :equilateral if a == b && b == c
  return :isosceles   if a == b || a == c ||  b == c
  return :scalene 

end
1 голос
/ 12 мая 2011

Вы должны убедиться, что новый созданный треугольник не нарушает «неравенство треугольника».Вы можете убедиться в этом по этой небольшой формуле.

if !((a-b).abs < c && c < a + b)
  raise TriangleError
end

Когда вы получаете сообщение об ошибке:

<TriangleError> exception expected but none was thrown.

Ваш код, вероятно, вызывает исключение при создании в этом файле правильного треугольника.about_triangle_project.rb

1 голос
/ 06 мая 2012

Вот моя версия ...: -)

def triangle(a, b, c)

  if a <= 0 ||  b <= 0 || c <= 0
    raise TriangleError
  end 

  if a + b <= c  || a + c <= b ||  b + c <= a
    raise TriangleError
  end 

  return :equilateral if a == b && b == c
  return :isosceles   if a == b || a == c ||  b == c
  return :scalene     if a != b && a != c &&  b != c 

end
1 голос
/ 12 августа 2011

Для Koan about_triangle_project_2.rb нет необходимости изменять класс TriangleError. Вставьте этот код перед алгоритмом треугольника, чтобы пройти все тесты:

if ((a<=0 || b<=0 || c<=0))
    raise TriangleError
end

if ((a+b<=c) || (b+c<=a) || (a+c<=b))
    raise TriangleError
end
1 голос
/ 29 января 2012

Это заняло немного времени. Но вот мое решение

def triangle(a, b, c)
  # WRITE THIS CODE
  raise TriangleError, "All sides must be positive number" if a <= 0 || b <= 0 || c <= 0
  raise TriangleError, "Impossible triangle" if ( a + b + c - ( 2 *  [a,b,c].max ) <= 0  )

  if(a == b && a == c)
      :equilateral
  elsif (a == b || b == c || a == c)
      :isosceles
  else
    :scalene
  end
end
1 голос
/ 06 марта 2017
def triangle(a, b, c)

  sides = a, b, c # Assigns variable signs (array) to all arguments.
  begin

  raise TriangleError if sides.inject(:+) <= 0 # Raise an error if all sides added together are less than or equal to 0. (the triangle would be invalid).
  raise TriangleError if sides.any?(&:negative?) #Raise an error if there are any negative sides.
  sides.each {|side| (side < (sides.inject(:+) - side) ? nil : (raise TriangleError))} # For the final check, Raise an error if any single side is greater than the other two sides added together. It can be broken down like this if side is less than (remaining sides - side we're comparing) raise an error, else, nil. 

  return :equilateral if sides.uniq.length == 1
  return :isosceles   if sides.uniq.length == 2
  return :scalene     if sides.uniq.length == 3

  resuce TriangleError
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...