2016-06-02 21 views
7

पर संबंधित विशेषता पर एक विशेषता की आवश्यकता है मेरे पास Foo एक विशेषता है जो Bar से विरासत में है। Bar में एक संबंधित प्रकार Baz है। Foo बाधा Baz जैसे Baz को Hoge लागू करना होगा।विरासत विशेषता के संबंधित प्रकार

trait Hoge {} 

trait Bar { 
    type Baz; 
} 

trait Foo: Bar where Self::Baz: Hoge {} 

हालांकि, जब मैं एक सामान्य समारोह Foo लागू करने के लिए सामान्य प्रकार T की आवश्यकता होती है, को परिभाषित

// [DESIRED CODE] 
fn fizz<T: Foo>(buzz: T) { 
    // ... 
} 

rustcEO277 साथ शिकायत जब तक कि मैं T स्पष्ट रूप से विवश:

fn fizz<T: Foo>(buzz: T) where T::Baz: Hoge { 
    // ... 
} 

मैं करता हूँ समझ में नहीं आता क्यों मुझे ऐसा करने की ज़रूरत है। मैं [DESIRED CODE] लिखने में सक्षम होना चाहता हूं। ऐसा करने का अनुशंसित तरीका क्या है?

+0

क्या आपको पता है कि 'विशेषता फू कहां है ...' अवधारणात्मक रूप से मान्य है? मैं देखता हूं कि यह * संकलित * है, इसलिए वाक्यविन्यास ठीक है, लेकिन ऐसा लगता है ... अजीब। – Shepmaster

+0

आप कल्पना कर सकते हैं कि मुझे संबंधित प्रकार ('बाज़') के कुछ व्यवहार की आवश्यकता है ताकि जब मैं कुछ कार्यान्वयन में 'फू' का उपयोग करता हूं, तो मैं उस व्यवहार का उपयोग कर सकता हूं, इस तरह कि कोई विरासत विशेषता के कुछ व्यवहार की आवश्यकता कैसे हो सकता है ('Bar')। – Tsukki

+0

क्षमा करें, मैं अस्पष्ट था।आपका * इरादा * काफी समझा जा सकता है (क्योंकि यह 'होगे' जैसे मेटासिंक्टैक्टिक वेरिएबल्स के साथ हो सकता है), मैं ज्यादातर पूछ रहा हूं कि क्या आपने कभी एक सामान्य परिभाषा के दौरान एक विशेषता परिभाषा के लिए 'कहां' खंड देखा है; मुझे यकीन नहीं है कि मेरे पास है। – Shepmaster

उत्तर

4

दुख की बात है (या नहीं), आपको सीमाओं को दोहराना होगा।

पिछले साल एक issue खोला गया था, यह सोचकर कि टाइप चेकर असंगत था। कोड आपके जैसा ही है।

@ arielb1 मुद्दा बंद कर दिया और कहा कि यह इच्छित व्यवहार था और यह स्पष्टीकरण दिया:

बात है कि हम नहीं करते भी कई गुना कार्यों के लिए परोक्ष उपलब्ध होने की इस रूप में चाहते हैं, है दूर के साथ नाजुकता का कारण बन सकता है जिससे कार्यों को संकलित करना बंद हो जाता है। मूल रूप से 3 फ़ंक्शन के लिए उपलब्ध सीमाओं के प्रकार हैं:

  • स्पष्ट कहां से क्लोज़ - सीमाएं T: B जब आपके पास यह खंड है। इसमें "सेमी-स्पष्ट" Sized बाध्य शामिल है। स्पष्ट जहां-खंड की supertraits से
  • सीमा - एक जहां-खंड अपने supertraits के लिए सीमा कहते हैं (trait B: A के रूप में, T: B बाध्य एक T: A बाध्य कहते हैं)।
  • तर्कों के जीवनकाल गुणों (बहिर्वाह/प्रत्यारोपण/निहित सीमाओं) से सीमाएं। ये केवल जीवनकाल सीमाएं हैं, और वर्तमान समस्या के लिए अप्रासंगिक। rust-lang/rfcs#1214 में शामिल थे जो उन्हें एक बड़ा सौदा था।

यदि आपकी बाध्य सूची में नहीं है, तो आपको इसे स्पष्ट रूप से जोड़ना होगा यदि आप इसका उपयोग करना चाहते हैं। मुझे लगता है कि यह एक एफएक्यू प्रविष्टि होना चाहिए।

आज मैंने यह जानकारी अनुरोध करने के लिए issue खोला है कि यह जानकारी दस्तावेज़ों में शामिल की जाए।

+0

मैं देखता हूं। मैं कुछ उचित रूप से अपेक्षित व्यवहार को छोड़कर इस विचार से असहमत हूं क्योंकि यह जंग को विकसित करना कठिन हो सकता है। हमें यह पता लगाना चाहिए कि उपयोगकर्ता क्या टाइप करना चाहते हैं और उससे मेल खाने के लिए अपना सर्वश्रेष्ठ काम करना चाहते हैं। – Tsukki

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