Obecnie próbuję przetestować jakiś kod RAII w rdzę i chciałbym opóźnić opóźnienie wartości do określonej linii kodu.

W C #, GC.Keepalive zapobiega gromadzeniu się obiektu zebranego na śmieci do odwołania do GC.Keepalive. Metoda jest zasadniczo no-OP z perspektywy aplikacji, ale gwarantuje ważne odniesienie do obiektu do określonego punktu przepływu kodu. Jest głównie przydatny do testowania.

Czy istnieje idiomatyczny sposób na opóźnienie opóźnienia wartości do pewnego punktu rdzy? Próbuję przetestować jakiś kod RAII i wolę używać konwencji rozpoznawalnej do innego programatora rdzy.

Na przykład:

let foo = some_func();

// Force foo to be deallocated

// This line does something that, if foo were still alive, it would fail the test
some_other_func();
0
Andrew Rondeau 28 październik 2020, 00:39

1 odpowiedź

Najlepsza odpowiedź

Najprostszym sposobem na to jest, aby wyraźnie upuścić obiekt. Po wywołaniu mem::drop obiekt zostanie przeniesiony do tej funkcji, dlatego obiekt musi istnieć w rozmówcy przed tym punktem, a nie po tym punkcie. To sygnalizuje innych deweloperów rdzy, które wyraźnie chciały zniszczyć w tym momencie. Niekoniecznie niekoniecznie wskazuje Dlaczego Chciałeś tam zniszczyć, więc nadal będziesz potrzebować komentarza, jeśli nie jest oczywiste z kontekstu.

Na przykład, gdybyś miał katalog tymczasowy i potrzebował go w pobliżu:

extern crate tempfile;

fn do_something() {
    let tempdir = tempfile::TempDir::new();

    // Do some things with your temporary directory.

    std::mem::drop(tempdir);

    // Do some things without your temporary directory.
}
1
bk2204 27 październik 2020, 23:58