2016-06-21 1 views
0

로봇 이름이라는 코드 작성 작업을하고있었습니다. 나는 또한 그것에 대한 테스트를했다. 프로그램은 모든 테스트를 통과했습니다. 코드는 메소드에서 정규 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 

처럼 보였다. 제공된 코드를 고려할 때 왜이 오류가 발생하고 두 가지 경우에서 무엇이 진행되고 있습니까? 감사!

답변

5

나는 시 모드 코드를 좋아하지만 여기에서 문제가 발생했습니다. 좀시 모드를 유지하지만 연산자 우선 순위 문제를 해결하기 위해

한 가지 방법은이 작업을 수행하는 것입니다

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

업데이트 : 당신이 코딩 표준으로 큰 회사에서 일하는 경우 당신은 그것을 확인해야합니다 조금 더 지루하다. 나는 이것이 명백했다라고 생각했다. 그러나 갤러리는 올바르게 보통의 해결책을 알아 차리고있다 :

@@robots.include?(name) ? reset : name 
+0

그것은 완전히 일했다! 감사! 하지만 왜 이것이 루비를 혼란스럽게 만들었습니까? 이름 때문에? 이 유형의 선언문을 사용할 때마다 혼동하지 않습니다. 왜이 경우에? –

+0

? : 연산자는 함수 매개 변수보다 더 가깝게 바인딩됩니다. 즉, Ruby는 다음과 같은 것을 평가하고있었습니다.'@@ robots.include? (name? reset : name)' – DigitalRoss

+0

알았습니다. 설명해 주셔서 감사합니다. –

관련 문제