2013-07-20 3 views
2
class A 
    def numbers 
    [1,2,3,4] 
    end 

    def get_numbers(condition) 
    numbers = [3,5] if condition 
    numbers 
    end 
end 

a = A.new 
a.get_numbers(true) # [3,5] 
a.get_numbers(false) # nil 

두 번째 경우에 [1,2,3,4]을 반환 할 것으로 기대합니다!Ruby 인스턴스 메서드 및 같은 이름의 조건부 로컬 변수 할당

P. 나는 솔루션을 찾고 있지 않다. (나는 두 개의 다른 변수 이름을 가지고있어 문제를 해결할 수있다.) 오히려 나는이 동작에 대한 설명을 찾고있다. 루비는 런타임 중에 numbers 변수를 생성한다. &은 nil으로 초기화된다. if 상태?

+0

왜 이것을 downvoted입니까? 그것은 유효한 질문입니다 ... – Mischa

+0

@ Mischa 정확히! –

답변

5

토큰이 로컬 변수 또는 메서드 호출로 해석 될 수있는 경우 로컬 변수가 우선 순위를 갖습니다. 메서드 정의에서 마지막 numbers은 로컬 변수로 해석됩니다. 메서드 호출로 해석되도록하려면 모호하지 않게해야합니다.

def get_numbers(condition) 
    return numbers = [3,5] if condition 
    numbers() 
end 

그러나 이것은 아주 냄새 나는 코드이며,이 같아야합니다 :

이것은 당신이 의도 아마

  • 루비가 생성합니까

    def get_numbers(condition) 
        condition ? [3,5] : numbers 
    end 
    
    변수 numbers을 [작성] 실행 중일 때 & [및] if 조건으로 [초기화]를 nil으로 초기화합니까?

예. 조건이 만족 되든 안되든 루비는 모든 것을 파싱하고, 조건이 만족되지 않아 지역 변수가 할당되지 않으면 nil으로 초기화됩니다.

+1

나는 변수의 이름을 바꾸거나 정규 if/then을 바꾸는 것보다 삼진 구문을 사용하여 코드가 향상되는지 질문한다. 설명 할 코드를 추가하겠습니다. –

+0

@theTinMan 삼진이 if-then보다 대폭 개선되었는지는 모르겠지만 가변 메소드 이름 충돌보다 훨씬 낫다고 생각합니다. – sawa

+0

나는 분명 동의한다. –

3

@sawa가 답을 가지고 있지만 코드에 조금 다른 변경을 권합니다. 나는 간단하게하고 명백한 코드를 갖고 싶은

def get_numbers(condition) 
    return [3,5] if condition 
    numbers() 
end 

:

def get_numbers(condition) 
    numbers = [3,5] if condition 
    numbers 
end 

도착 : 나는 갈 것입니다. 지역 변수에 대한 할당은 아무 것도 수행하지 않으며 빈 괄호없이 메소드 이름을 사용하는 것은 메소드 호출이라는 것을 혼란스럽게하거나 숨 깁니다.


코드를 작성하는 또 다른 방법, 즉, 완전히 받아 들일 수 있습니다 : 심지어

def get_numbers(condition) 
    if condition 
    return [3,5] 
    else 
    numbers() 
    end 
end 

나 :

def get_numbers(condition) 
    if condition 
    [3,5] 
    else 
    numbers() 
    end 
end 

코드 작성 모든 정답을 얻기에 관하여하지만, 또한 6 개월 또는 1 년 내에 그 곳으로 돌아갈 수 있고, 당신이 한 일을 기억하려고 노력할 필요가 없으며, 더 나쁜 것은 왜했는지에 관한 것입니다. 다른 사람들은 우리 코드를 상속받습니다. 그래서 우리가 명확하고 깔끔하고 간결하게 작성하지 않을 때 우리가 마음 속에서 일으킬 수있는 파괴에 민감해야합니다.

+0

이제 불필요한 지역 변수를 제거 했으므로 더 이상 메소드 호출을 'numbers'로 명확하게 구분할 필요가 없습니다. – sawa

+0

깔끔한 설명 주셔서 감사합니다 :) –

관련 문제