로봇 이름이라는 코드 작성 작업을하고있었습니다. 나는 또한 그것에 대한 테스트를했다. 프로그램은 모든 테스트를 통과했습니다. 코드는 메소드에서 정규 if 문을 사용할 경우 프로그램이 모든 테스트를 통과하는 이유는 무엇입니까?하지만 대신 삼항 연산자를 사용할 때 '스택 수준이 너무 높음'이라고 말하면 어떻게됩니까?
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
메소드입니다. 그래서 코드를 리팩토링 후 모든 검사를 SystemStackError: stack level too deep
보여 주었다이 버전은이
class Robot
...
# the rest of code stayed the same
def no_duplicate(name)
@@robots.include? name ? reset : name
end
end
처럼 보였다. 제공된 코드를 고려할 때 왜이 오류가 발생하고 두 가지 경우에서 무엇이 진행되고 있습니까? 감사!
그것은 완전히 일했다! 감사! 하지만 왜 이것이 루비를 혼란스럽게 만들었습니까? 이름 때문에? 이 유형의 선언문을 사용할 때마다 혼동하지 않습니다. 왜이 경우에? –
? : 연산자는 함수 매개 변수보다 더 가깝게 바인딩됩니다. 즉, Ruby는 다음과 같은 것을 평가하고있었습니다.'@@ robots.include? (name? reset : name)' – DigitalRoss
알았습니다. 설명해 주셔서 감사합니다. –