수색…


통사론

  • @goto 라벨
  • @ 라벨 라벨

비고

고급 제어 흐름을 과도하게 사용하거나 부적절하게 사용하면 코드가 읽기 어려워집니다. 다른 언어로 된 @goto 또는 이와 동등한 언어는 부적절하게 사용될 경우 읽을 수없는 스파게티 코드로 이어집니다.

C와 같은 언어와 마찬가지로 Julia의 함수간에 도약 할 수 없습니다. 이것은 또한 @goto 가 최상위 레벨에서 불가능하다는 것을 의미합니다. 함수 내에서만 작동합니다. 또한, 내부 함수에서 외부 함수로, 또는 외부 함수에서 내부 함수로 이동할 수 없습니다.

입력 유효성 검사

전통적으로 고려 된 루프는 @goto@label 매크로를 사용하여 고급 제어 흐름을 @label 수 있습니다. 하나의 유스 케이스는 한 부분의 실패가 전체 기능의 재 시도로 이어질 때가 많으며 입력 유효성 검사에 종종 유용합니다.

function getsequence()
    local a, b

@label start
    print("Input an integer: ")
    try
        a = parse(Int, readline())
    catch
        println("Sorry, that's not an integer.")
        @goto start
    end

    print("Input a decimal: ")
    try
        b = parse(Float64, readline())
    catch
        println("Sorry, that doesn't look numeric.")
        @goto start
    end

    a, b
end

그러나 재귀를 사용하면이 유스 케이스가 더 명확 해집니다.

function getsequence()
    local a, b

    print("Input an integer: ")
    try
        a = parse(Int, readline())
    catch
        println("Sorry, that's not an integer.")
        return getsequence()
    end

    print("Input a decimal: ")
    try
        b = parse(Float64, readline())
    catch
        println("Sorry, that doesn't look numeric.")
        return getsequence()
    end

    a, b
end

두 예제 모두 똑같은 일을하지만 두 번째 예제는 더 쉽게 이해할 수 있습니다. 그러나 첫 번째 호출은 더 많은 성능을 제공합니다 (재귀 호출을 피하기 때문에). 대부분의 경우 전화 비용은 중요하지 않습니다. 그러나 제한된 상황에서는 첫 번째 양식이 허용됩니다.

오류 정리

C와 같은 언어에서 @goto 문은 오류가 발생하더라도 함수가 필요한 자원을 정리하는 데 사용됩니다. Julia에서는 예외와 try - finally 블록이 종종 대신 사용되기 때문에 이것은 덜 중요합니다.

그러나 Julia 코드가 C 코드 및 C API와 인터페이스 할 수 있으므로 때로는 함수가 여전히 C 코드와 같이 작성되어야합니다. 아래 예제는 인위적이지만 일반적인 사용 사례를 보여줍니다. Julia 코드는 Libc.malloc 을 호출하여 메모리를 할당합니다 (C API 호출을 시뮬레이트합니다). 모든 할당이 성공하지 못하면 함수는 지금까지 얻은 자원을 해제해야합니다. 그렇지 않으면 할당 된 메모리가 반환됩니다.

using Base.Libc
function allocate_some_memory()
    mem1 = malloc(100)
    mem1 == C_NULL && @goto fail
    mem2 = malloc(200)
    mem2 == C_NULL && @goto fail
    mem3 = malloc(300)
    mem3 == C_NULL && @goto fail
    return mem1, mem2, mem3

@label fail
    free(mem1)
    free(mem2)
    free(mem3)
end


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow