Neden açık ömürleri Pas ihtiyaç vardır?
Pas kitabı lifetimes chapter okuyordum, ve üzerinde adı ve açık bir ömür boyu bu örnek geldi:
struct Foo<'a> {
x: &'a i32,
}
fn main() {
let x; // - x goes into scope
// |
{ // |
let y = &5; // --- y goes into scope
let f = Foo { x: y }; // --- f goes into scope
x = &f.x; // | | error here
} // --- f and y go out of scope
// |
println!("{}", x); // |
} // - x goes out of scope
Derleyici tarafından hata engel olmak olduğunu bana oldukça açıktırkullan-sonra-serbestiç kapsam, f
yapılır ve bu nedenle &f.x
geçersiz olur, ve x
atanmış gerekir sonra. referans x
atanan:
Benim sorun bu sorun kolayca ortadan analiz olabilirdiolmadankullanarakaçık'a
ömür boyu, daha geniş bir kapsam için bir başvuru (x = &f.x;
) yasadışı bir görev çıkarım tarafından mesela.
Hangi durumlarda açık yani aslında-sonra-ücretsiz kullanımı (ya da başka bir sınıf mı?) önlemek için gerekli yaşam hatalar?
CEVAP
Diğer cevapların belirgin nokta (fjh's concrete example where an explicit lifetime is needed) var, ama eksik bir anahtar şey: neden açık yaşam gerekliderleyici onları yanlış anladın söyleyecektir?
Bu aslında aynı soru "neden açık tip derleyici bunları anlaması zaman ihtiyaç vardır". Farazi bir örnek:
fn foo() -> _ {
""
}
Tabii derleyici &'static str
, Bir çok dönen olduğumu görmüyor neden programcı türü var mı?
Ana nedeni, derleyici kodu ne ise sizin niyetinizin ne olduğunu bilmiyor.
Fonksiyonları değiştirme kodu etkileri güvenlik duvarı için doğal bir sınır vardır. Eğer yaşam tamamen koddan denetlenmeye izin verecek olursak, o zaman masum görünümlü bir değişiklik sonra bir işlevi uzakta hataları neden olabilir yaşam etkileyebilir. Bu bir varsayım değil. Anladığım kadarıyla, Haskell üst düzey işlevler için tür çıkarımı bağımlı olduğunuz zaman bu sorun var. Pas tomurcuk halinde bu sorunu ısırdı.
Ayrıca derleyici için verimli bir yararı yoktur fonksiyonlu imza türleri ve yaşam süreleri doğrulamak için ayrıştırılması gerekir. Daha da önemlisi, programcı için verimli bir faydası vardır. Eğer açık yaşam süreleri vardı eğer doğru değilse, bu fonksiyon ne yapar:
fn foo(a: &u8, b: &u8) -> &u8
İmkansız kodlama en iyi uygulamalar, çok sayıda karşı olan kaynak, incelemeden söylemek zor.
daha geniş bir kapsam için bir referans yasadışı bir görev çıkarım
Kapsamlarıaslında yaşam. Biraz daha net, hayat boyu 'a
genel yaşam parametresibu ara siteye göre derleme zamanında belirli bir kapsam ile uzmanlaşmış olabilir.
açık yaşam aslında önlemek için gerekli [...] hata?
Hiç de değil.Ömrümüzühataları önlemek için ihtiyaç vardır, ama açık ömürleri biraz aklı programcılar ne korumak için gereklidir.
Neden bazı yüzer < karşılaştırmalar...
Neden bir dizin oluştururken fıkra VAR...
Neden bu hafıza taşması atakları açık ...
En iyi CSS vardır? Neden @import kulla...
Neden python pandalar birleştirir daha...