2017-01-06 15 views
7

, Index trait tanımlanır: `Index` özelliğinin` Idx` tipi parametresinin neden boyutunun değiştirilemediğine izin verilir? aşağıdaki gibi Rust 1.14 olarak

pub trait Index<Idx> where Idx: ?Sized { 
    type Output: ?Sized; 
    fn index(&self, index: Idx) -> &Self::Output; 
} 

Output Çeşidi bağlanmış kapalı Sized

burada ?Sized ile rahat. Hangisi mantıklı, çünkü index() yöntemi Output'a bir başvuru döndürüyor. Böylece, kullanışsız tipler kullanılabilir; Örnek: bağlı

impl<T> Index<Range<usize>> for Vec<T> { 
    type Output = [T]; // unsized! 
    fn index(&self, index: Range<usize>) -> &[T] { … } // no problem: &[T] is sized! 
} 

Idx tür parametresi örtülü zamanda rahat ve karışık olabilir. Ancak Idx, değer olarak yöntem argümanı olarak kullanılır ve bağımsız değişkenler argüman olarak kullanılamaz AFAIK. Neden Idx, boyutlandırılmaya izinli değil?

cevap

6

Eminim ki bu sadece tarihin bir kazası. Bu gevşek was introduced in 2014'u bağladı. zaman içinde bu noktada, Index tip kodları ile geçildi

// Syntax predates Rust 1.0! 
pub trait Index<Sized? Index, Sized? Result> for Sized? { 
    /// The method for the indexing (`Foo[Bar]`) operation 
    fn index<'a>(&'a self, index: &Index) -> &'a Result; 
} 

Not: O zaman, sürekli bir miktar farklı görünüyordu. Daha sonra renamed Idx type changed to pass by value üzerine:

fn index<'a>(&'a self, index: Idx) -> &'a Self::Output; 

Ancak hem formları farklı derleyici önyükleme aşamalarında eşlik ettiğini unutmayın. Muhtemelen isteğe bağlı Sized bağlantı noktasının hemen kaldırılmasının nedeni bu değil. benim tahminim, daha önemli değişiklikler nedeniyle temel olarak unutuldu ve şimdi olduğumuz yerdeyiz.

O (?Sized kaldırarak) bağlı bir şey kıracak kısıtlayan karar vermek için ilginç bir düşünce deneyi var ... belki birisi üzerinde ...^_^

Düşünce deneyi bir PR sunmalıdır! Lukas submitted a PR! neye Index ait subtraits oluşturur mansap kodunu bozabilir tartışma meydana gelmiş:

use std::ops::Index; 
trait SubIndex<I: ?Sized>: Index<I> { } 

Orada da ki bir gün konuşmak var anlamıyorum rağmen, biz, değeriyle dinamik boyutlu tiplerini (DSTS) iletmek isteyebilirsiniz Nasıl.

+3

Her zamanki gibi mükemmel cevap! – mcarton

+2

* Ayrıca, bir gün, dinamik büyüklükteki türleri (DST'ler) değere göre değiştirmek isteyebileceğimizi de söylüyorum, ancak nasıl olduğunu anlamıyorum. * => Dil ve uygulama arasında bir fark var. Sadece dil bir hareket (değerden geçmek) göz önünde bulundurduğundan, ABI seviyesinde değerin işaretçi tarafından geçilmediği anlamına gelmez. Ve böylece dilin DST'yi gerçek uygulama ile bir işaretçinin kullanıldığı değerlere geçirmesi oldukça mantıklıdır. Ancak, onlara göre değer döndürmek, daha zor görünüyor :) –

İlgili konular