2015-06-10 16 views
13

Chcę zaimplementować program budujący podobny do debugowania builders zdefiniowany przez bibliotekę standardową. Zdefiniowane są one za pomocą struktur jak następuje:Czy <'a, 'b: 'a> oznacza, że ​​życie "b musi przeżyć całe życie"?

struct DebugFoo<'a, 'b: 'a> { 
    fmt: &'a mut std::fmt::Formatter<'b> 
} 

Ponieważ ja nie rozumiem, co postaci <'a, 'b: 'a> środków ani znajdę to wspomniane w książce rdzy lub odniesienie Rust (przynajmniej dotyczące wcieleń), po prostu starał się usunąć, czego nie rozumiemy, aby zobaczyć co się dzieje:

struct DebugFoo<'a, 'b> { 
    fmt: &'a mut std::fmt::Formatter<'b> 
} 

Kompilacja mi ten błąd:

in type `&'a mut core::fmt::Formatter<'b>`, reference has a longer 
lifetime than the data it references 

i to uwaga:

the pointer is valid for the lifetime 'a as defined on the struct at 1:0 
but the referenced data is only valid for the lifetime 'b as defined on 
the struct at 1:0 

To ma sens do mnie: 'a i 'b różne okresy tak, aby być po bezpiecznej stronie, Rust (? Kontrolujący pożyczyć) zakłada, że ​​'a przeżyje 'b i wyrzuca błąd.

Teraz mogę zgadywać, że <'a, 'b: 'a> oznacza, że ​​czas życia 'b musi być dłuższy niż czas życia 'a. Zgadłem, prawda? Czy jest coś więcej? Jak mogę to udokumentować?

Odpowiedz

16

Dwukropek jest czytana "żyją dłużej", więc

'long: 'short 

jest czytana "'long żyją dłużej 'short".

Jeśli chodzi o oficjalny dokument na ten temat, jedynym miejscem, które widziałem do tej pory udokumentowanym, jest RFC on lifetime bounds.

8

Tak, masz rację.

Związany <...: 'a> oznacza, że ​​... (typ lub inny okres życia) musi być w stanie przeżyć 'a. Na przykład. 'b: 'a oznacza, że ​​"'b musi żyć co najmniej tak długo, jak 'a" (nie ściśle przeżyć, chociaż: mogą być takie same).

Powiązane problemy