2015-01-10 15 views
8

Dilimlerle oynamak için oldukça başarısız bir şekilde deniyorum.Bir dilimdeki dizinleme işleminin dönüş tipi nedir?

pub trait Index<Index> { 
    type Output; 
    fn index(&'a self, index: &Index) -> &'a <Self as Index<Index>>::Output; 
             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
} 

Ancak derleyici bana verir: O slice[index] dönüş tipi documentation verilen bir referans olması benim beklenti

fn at<'a, T>(slice: &'a [T], index: usize) -> &'a T { 
    let item = slice[index]; 
    item 
} 

geçerli:

Ben benim ilk sorunu azaltmıştır Bir hata:

error: mismatched types: expected &'a T , found T (expected &-ptr, found type parameter)

  item 
      ^~~~ 

Hangi ben mea olarak yorumluyorsunuz item tipi işlevinin dönüş türü eşleşmiyor ning (Karşılığında gelen ifade değerlendirme bölmek, sadece hata ayıklama amacıyla item tanıtıldı).

Ve tabii ki ben beklendiği gibi bir borrow hareketli hakkında başka hata mesajı item türüdür T dönüş türünü geçerseniz. Bir referans hile yok olmaya türünü zorlayarak

fn at<'a, T>(slice: &'a [T], index: usize) -> &'a T { 
    &slice[index] 
    ^
} 

fn at<'a, T>(slice: &'a [T], index: usize) -> &'a T { 
    let ref item = slice[index]; 
     ^~~ 
    item 
} 

:

biraz müdahalesi sonra sonunda iki alternatif çözüm var.

Ama neden bu kurnazlık ilk etapta gerekli olan? Yanlış bir şey yapıyorum?

cevap

8

Bu derleyici kod biraz daha güzel görünmesi için sende olduğu yararlı ergonominin bir parçasıdır.

Index özellik dönüş değeri, bir referans, ancak şekerli sözdizimini[] kullandığınızda derleyici otomatik bir dereference ekler. Diğer birçok dil, öğeyi diziden döndürür (kopyalamak veya nesneyi başka bir başvuruya döndürmek, uygun olan her şey). indeksleme değerdir

let items = &[1u8, 2, 3, 4]; 

let a: u8 = items[0]; 
let a: u8 = *items.index(&0); // Equivalent of above 

let b: &u8 = &items[0]; 
let b: &u8 = &*items.index(&0); // Equivalent of above 

Not: bu durumlarda, genellikle bir & kullanacak böylece, her zaman, bir kopyaya değer yapamaz nedeniyle taşı/kopyala anlambilimin Rust önemine

otomatik olarak referansa benzer şekilde otomatik olarak referans olarak alınır.

+0

Ah! Gördüğüm için, [] 'nin şekeri tarafından yakalandım!Ben bir fark beklemediğim gibi, doğrudan indekslemeyi düşünmemiştim, fark ettim ki fark ettim ki fark ettim ki, '' '' '' '' '' '' '' '' '' '' '' '' 't' ile' indeks'ı çağırmaktan çugk difference wouldr difference differencer. Resim için teşekkürler, gerçekten şeyleri görselleştirmeye yardımcı oluyor. –

5

Hayır, doğru şeyi yapıyoruz. index() yöntemi bir referans döndürürken, bir indeksleme işleminde çağrıldığında, sonuç otomatik olarak silinir. Bu, indekslemenin daha doğal olması için yapılır: bir tür indeksleme operatörünün bulunduğu her dilde (esas olarak C ve C++), konteynırlara yapılan referanslar değil, değerlerini kendileri döndürür. Eğer (İlk "geçici çözüm" gibi) açıkça referans operatörü uygulamak ya da (ikinci birinde benzeri) referans modelini kullanmak zorunda koleksiyonuna bir başvuru elde etmek için

.

İlgili konular