Зачем программе проходить все тесты, если я использую в методе регулярное выражение if, но говорит, что вместо этого использует троичный оператор?

Я работал над проблемой кодирования под названием Robot name. У меня также были тесты для этого. Программа прошла все тесты. Код ниже..

class Robot
  attr_accessor :name
  @@robots = []
  def initialize
    @name = self.random_name
    @@robots << self.name
  end

  def random_name
    name = ''
    2.times do
      name  << ('a'..'z').to_a.sample
    end
    3.times do
      name  << (1..9).to_a.sample.to_s
    end
    no_duplicate(name.upcase)
  end

  def reset
    @name = self.random_name
  end

  def no_duplicate(name)
    if @@robots.include? name
      reset
    else
      name
    end
  end
end

Если вам нужно посмотреть файл тестов, вы можете посмотреть его здесь robot_name_tests.

Затем я начал рефакторинг, и одним из первых был рефакторинг no_duplicate метод. Так что после рефакторинга код выглядел так

class Robot

  ...
  # the rest of code stayed the same

  def no_duplicate(name)
    @@robots.include? name ? reset : name
  end
end

С этой версией все тесты показали SystemStackError: stack level too deep, Почему это дает эту ошибку и что происходит за кулисами в обоих случаях, учитывая предоставленный код? Спасибо!

1 ответ

Мне нравится ваш код в режиме поэзии, но он привел вас сюда.

Один из способов сохранить это в поэтическом режиме, но исправить проблему с приоритетом вашего оператора, это сделать это:

   def no_duplicate(name)
     (@@robots.include? name) ? reset : name
   end

Обновление: если вы работаете в Большой корпорации со стандартами кодирования, вам нужно будет сделать это немного скучнее. Я думал, что это было очевидно, но галерея правильно отмечает обычное решение:

   @@robots.include?(name) ? reset : name
Другие вопросы по тегам