SORU
24 Temmuz 2015, Cuma


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
24 Temmuz 2015, Cuma


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 'agenel 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • echifitness

    echifitness

    9 Kasım 2008
  • Liam Underwood

    Liam Underwo

    19 Mayıs 2009
  • Microsoft Research

    Microsoft Re

    24 EKİM 2008