openlang

정리 블록이 실제로 실행될 때까지 가변 빌림을 미루기

Rust에서 Java의 try { ... } finally { ... }와 비슷하게 패닉에도 안전한 구조를 만들고, try와 finally 블록이 같은 값을 각각 가변으로 빌리게 하려면 어떻게 해야 하나요?

원하는 건 정상 실행이든 패닉 언와인딩이든 제어가 try 블록을 떠나는 순간 그 빌림이 끝나고, finally 블록에 실제로 도달했을 때만 그쪽 빌림이 시작되는 거예요.

scopeguard::defer!를 쓰면 try에 해당하는 블록보다 앞에서 클로저를 선언해야 해요. 그러면 클로저를 만드는 즉시 가변 빌림이 시작돼서, try에 해당하는 코드에서는 그 클로저가 이미 빌린 같은 값을 가변으로 빌릴 수 없어요.

영어에서 번역원문 보기

이어지는 대화 2

서로의 근거를 따라
  1. 고유 링크

    scopeguard::defer!를 쓰면 try에 해당하는 블록 앞에 클로저를 선언해야 해서 클로저를 만드는 즉시 가변 빌림이 시작돼요,

    여기에는 defer!()가 맞지 않고, 대신 guard 함수로 값을 scopeguard::ScopeGuard 안에 넣으면 돼요.

    ScopeGuard가 Deref와 DerefMut를 제공하므로 가드 안의 값에 접근하듯 가드를 사용하면 돼요.

    struct Resource {}
    
    // ownership of the resource goes into this destructor
    // a closure normally serves this purpose
    fn release_resource(resource: Resource) {
        println!("dropping resource");
    }
    
    fn main() {
        // obtain the resource, then give it a guard
        let resource: Resource = acquire_resource();
        let mut resource = guard(resource, release_resource);
        // borrowing the resource mutably is another option
        // let mut resource = guard(&mut resource, release_resource_by_mut);
    
        // access the enclosed resource through its guard
        resource.refresh();
        inspect_resource(&resource);
        change_resource(&mut resource);
    
        // leaving this scope runs the destructor
        // or disable the guard to recover the resource
        // without invoking its destructor
        // let resource = ScopeGuard::into_inner(resource);
    }
    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. 같은 sink 호출인데 한 번은 복사, 한 번은 이동

    Nim 2는 복사냐 이동이냐를 호출 지점마다 정한다. proc 단위로 정하지 않는다. 같은 인자, 같은 proc. 첫 호출은 a가 아직 쓰이니 복사한다. 둘째 호출은 이동한다. 호출 지점에는 어느 쪽인지 아무 표시가 없다.…

    답글 2최근 활동 nim
  2. 포인터를 통해 문자 배열 입력받기

    키보드에서 char 배열들로 입력을 받으려고 하면 프로그램이 계속 죽습니다. 키보드에서 char 배열을 읽어서 저장하는 간단한 방법이 뭘까요?

    답글 2최근 활동 c
  3. 전역 변수에 의존하지 않는 입력 함수를 만들 수 있나요?

    사용자 입력을 처리하고 걸러 낸 뒤, 호출한 함수에 결과 문자열을 돌려주는 함수를 만들고 싶습니다. 아래 예처럼 전역 변수를 선언하지 않고도 가능할까요?

    답글 2최근 활동 c