2017-10-17 10 views
7

the docs, मैं और देखो दोनोंअंतर <T: Trait> के बीच और जहां टी: <code>Send</code> विशेषता के लिए में विशेषता

impl<T> Send for LinkedList<T> 
where 
    T: Send, 

और

impl<T: Send> Send for LinkedList<T> 

इन दोनों वाक्यविन्यास बीच क्या अंतर है, यह कैसे प्रभाव होगा मेरा कोड अगर मैं अपनी खुद की विशेषता के लिए impl घोषणाएं लिख रहा था?

उत्तर

8

where क्लॉज के अंदर परिभाषित विशेषता सीमाएं इनलाइन घोषित विशेषता सीमाओं का एक सुपरसेट है। इनलाइन शैली where खंड से पहले मौजूद थी; where खंड introduced in RFC 135 था:

where खंड है, जो विशेषता पैरामीटर सीमा निर्दिष्ट करने की एक अधिक अर्थपूर्ण साधन उपलब्ध कराने जोड़ें। [...] मौजूदा सीमा नोटेशन where खंडों के लिए वाक्य रचनात्मक चीनी के रूप में बने रहेगा।

यहाँ कि साथ काबू पाने कर रहे हैं वर्तमान सीमा वाक्य रचना के साथ सीमाओं की एक सूची है, जहां वाक्य रचना:

  • यह प्रकार पैरामीटर के अलावा और कुछ पर सीमा व्यक्त नहीं कर सकते। इसलिए, यदि आप एक समारोह T में सामान्य है, तो आप T:MyTrait घोषित करने के लिए है कि TMyTrait को लागू करना चाहिए लिख सकते हैं, लेकिन आप Option<T> : MyTrait या (int, T) : MyTrait नहीं लिख सकते हैं। ये रूप कम कम से कम आवश्यक हैं लेकिन अभी भी महत्वपूर्ण हैं।

  • यह संबंधित प्रकारों के साथ अच्छी तरह से काम नहीं करता है। ऐसा इसलिए है क्योंकि किसी संबंधित प्रकार के मान को निर्दिष्ट करने के लिए कोई स्थान नहीं है। अन्य भाषाएं इस उद्देश्य के लिए खंड (या कुछ समान) का उपयोग करती हैं।

  • यह पढ़ने के लिए बस इतना मुश्किल है। अनुभव दिखाया गया है कि सीमाओं की संख्या बढ़ने के साथ ही वर्तमान वाक्यविन्यास पढ़ने के लिए मुश्किल हो जाता है और प्रारूप।

तब से आप भी उपयोग कर सकते हैं उच्च रैंक वाले विशेषता एक where खंड में सीमा (for <'a> ...):

fn foo<T, U>() 
where 
    // higher-ranked trait bounds 
    for<'a> T: SomethingElse<'a>, 
    // Bound not directly on the generic type 
    i32: From<U>, 
    T: Iterator, 
    // Bound on an associated type 
    T::Item: Clone, 
    // Just really long 
    U: ReallyLong + AnotherReallyLong + WowReallyLong, 
{} 

अपनी आवश्यकताओं इनलाइन विशेषता सीमा से पूरी की जा सकती है, तो आपके कोड पर कोई प्रभाव नहीं है। यदि आपको अतिरिक्त शक्तियों की आवश्यकता है जो केवल where सक्षम करता है, तो आपको where का उपयोग करने की आवश्यकता है।


मेरा व्यक्तिगत शैली को हमेशाwhere फार्म का उपयोग है।नई सीमा जोड़ते समय git diff पर एक भी आकार होना आसान है जो मेरे लिए कोड की अतिरिक्त रेखा के लायक है।

+2

टीबीएच यह उन उदाहरणों में से एक है जहां मैं पायथन के जेन के लिए लंबा हूं :) इसके अलावा, ऐतिहासिक रूप से मामूली विसंगतियां हैं, मुझे याद है कि 'आकार' का उपयोग केवल थोड़ी देर के लिए 'जहां' खंड में किया जा सकता है। –

+3

@MatthieuM। यह दूसरी तरफ था - 'आकार' केवल इनलाइन काम करता था। मुझे याद है क्योंकि मैं एक एकल शैली भी पसंद करता हूं ('जहां' का उपयोग करके) लेकिन यह 'आकार' के लिए काम नहीं करता है ... – Shepmaster

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