2017-01-06 5 views
7

जंग 1.14 में, Index trait इस प्रकार परिभाषित किया गया है:`इंडेक्स` विशेषता का` Idx` प्रकार पैरामीटर क्यों अनसुलझा होने की अनुमति है?

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

निहित SizedOutput प्रकार के लिए बाध्य ?Sized यहाँ के साथ आराम है। जो समझ में आता है, क्योंकि index() विधि Output का संदर्भ देता है। इस प्रकार, अनसुलझा प्रकारों का उपयोग किया जा सकता है, जो उपयोगी है; उदाहरण:

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 प्रकार पैरामीटर का अंतर्निहित बाध्य भी आराम है और अनवधि जा सकता है। लेकिन Idx का उपयोग विधि तर्क के रूप में किया जाता है और अनसुलझा प्रकारों का उपयोग करके तर्क संभव नहीं है AFAIK। Idx क्यों अनसुलझा होने की अनुमति है?

उत्तर

6

मुझे पूरा यकीन है कि यह सिर्फ इतिहास का दुर्घटना है। वह कमजोर was introduced in 2014 बाध्य है।

// 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; 
} 

ध्यान दें कि समय में इस बिंदु पर, Index प्रकार संदर्भ द्वारा पारित किया गया था: उस समय, विशेषता थोड़ी अलग देखा। renamed Idx type changed to pass by value पर बाद में:

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

हालांकि, ध्यान दें कि दोनों रूपों अलग संकलक बूटस्ट्रैप चरणों में coexisted। शायद यही कारण है कि वैकल्पिक Sized बाध्य तुरंत हटाया नहीं जा सका। यह मेरा अनुमान है कि यह मूल रूप से अधिक महत्वपूर्ण परिवर्तनों के कारण भूल गया था, और अब हम कहां हैं हम हैं।

यह अगर सीमित बाध्य (हटाने के ?Sized से) कुछ भी टूट जाएगा तय करने के लिए एक दिलचस्प सोचा प्रयोग है ... शायद किसी को एक पीआर

सोचा प्रयोग से अधिक प्रस्तुत करना चाहिए ...^_ ^! Lukas submitted a PR! वहाँ चर्चा है कि यह नीचे की ओर कोड इस तरह Index की subtraits बनाता तोड़ सकता हो गया है:

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

वहाँ भी है कि किसी दिन बात है, हम, मूल्य द्वारा गतिशील रूप से आकार प्रकार (DSTs) पारित करने के लिए चाहते हो सकता है, हालांकि मुझे समझ नहीं आता किस तरह।

+3

सामान्य रूप से महान उत्तर! – mcarton

+2

* किसी भी बात की बात है कि किसी दिन, हम मूल्य से गतिशील रूप से आकार (डीएसटी) पारित करना चाहते हैं, हालांकि मुझे समझ में नहीं आता कि कैसे। * => भाषा और कार्यान्वयन के बीच एक अंतर है। सिर्फ इसलिए कि भाषा इसे एक कदम (मूल्य से गुजरती) मानती है कि इसका मतलब यह नहीं है कि एबीआई स्तर पर मूल्य सूचक द्वारा पारित नहीं किया जाता है। और इस प्रकार यह पूरी तरह से समझदार है कि भाषा को वास्तविक कार्यान्वयन के साथ मूल्यों द्वारा डीएसटी पास किया जा रहा है कि एक सूचक का उपयोग किया जाता है। मूल्य से उन्हें वापस लौटना, हालांकि, trickier लगता है :) –

संबंधित मुद्दे

 संबंधित मुद्दे