Зачем программе проходить все тесты, если я использую в методе регулярное выражение 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