2012-09-15 1 views

답변

0

을하지 않고, 두 번 호출되지 않도록 RETVAL 당신은 retval에 결과를 memoize 수 있음을 구조 조정하는 방법이 있습니다

def retval 
    return @retval if @retval 
    # some resource intensive computation 

    @retval = whatever 
end 

def foo 
    ... 
    return retval if retval 
    ... 
end 

짧은 방법의 경우 멋진 숙어는 다음과 같습니다.

def retval 
    @somevar ||= some_work 
end 
+0

내 생각에 'retval'이 상황에 따라 다른 결과를 반환 할지라도, 멋진 메모는 내가 생각하지 못했던 훌륭한 제안이므로, 이런 종류의 결과 캐싱을 수행 할 수는 없습니다. 즉, 다음에 컨트롤이'foo'를 통과 할 때 다시 평가해야합니다. – Purplejacket

3

여기

def foo 
    if x = retval 
    return x 
    end 
    ... 
end 

나는 당신이 단지 구문에 찾는 경우가 크게 다른 결과를 얻을 수 없습니다 두려워 같은 일의 또 다른 변형이다. 게다가이게 뭐가 잘못 됐어?

def foo 
    ... 
    x = retval 
    return x if x 
    ... 
end 

이렇게 작성했습니다.

+0

"이게 뭐가 잘못 됐니?" ... 나는 그렇게 나쁘지 않다고 생각한다 ... 나는 단지 문법 설탕에 의해 '|| ='와 같이 버릇이 없다. 그래서이 상황을 다루기에 좋은 것이 있는지 궁금하다. – Purplejacket

+0

그래, 그것은 두 개의 라이너가 최고의 대답 인 것 같습니다. – Purplejacket

0

당신은 x가 이미 정의되어있는 경우에만 작동 한 라이너

return x if (x = retval) 

을 찾고 있습니다.

if x = retval; x; end 

작업을 수행하지만 아무도 정말 그런 식으로 루비를 기록하지 않습니다.

return true if retval 

이 가능, 상황에 있습니다 따라, 또는 당신은 실제로 retval에서 반환 된 값이 반환 할 것을 요구합니까?

업데이트 : : OP에서 예로 대답 했으므로 값을 반환해야하므로 Sergio의 대답은 IMHO입니다. 물론 표현식 내부에 오히려 못된 임무를 가진 한면을 만드는 또 다른 방법이 있습니다.

x = retval and return x 

Yikes! :-)

+1

당신은 틀림없이'if x = retval; 엑스; 끝 ', 안 그래? :) –

+0

+1 분명히! 감사. –

+0

그래, 실제로 retval이 반환되어야합니다. – Purplejacket

관련 문제