2013-06-10 20 views
5

मैं एक समारोह जो पूर्णांकों का एक लिंक्ड सूची बनाने के लिए काम करता है लागू करने के लिए:जंग: लक्षण/typeclasses का उपयोग कर एक सामान्य संख्यात्मक समारोह

enum List<T> { Cons(T, ~List<T>), End } 

fn range(start: int, end: int) -> ~List<int> { 
    if start >= end { ~End } 
    else { ~Cons(start, range(start+1, end)) } 
} 

हालांकि, मैं सहित किसी भी सांख्यिक प्रकार की एक सीमा बनाना चाहते यूंट्स, युगल और पसंद है। लेकिन इस उदाहरण के लिए, काम नहीं करता:

fn range<T: ord>(start: T, end: T) -> ~List<T> { 
    if start >= end { ~End } 
    else { ~Cons(start, range(start+1, end)) } 
} 

जो पैदा करता है:

> rustc list.rs 
list.rs:3:12: 3:15 error: use of undeclared type name `ord` 
list.rs:3 fn range<T: ord>(start: T, end: T) -> ~List<T> { 
         ^~~ 
error: aborting due to previous error 

मैं जंग में एक सामान्य समारोह है जो अपने आप को प्रतिबंधित करता है "सांख्यिक" प्रकार के द्वारा प्रतिदेय होने के लिए कैसे कर सकते हैं? इंटरफ़ेस को विशेष रूप से लिखने के बिना? मैंने माना था कि कई मानक-पुस्तकालय लक्षण थे (जैसे मैनुअल के सेक्शन 6.2.1.1 में सूचीबद्ध eq, ord, आदि, हालांकि अब मैं सोच रहा हूं कि वे उचित "लक्षण" हैं या नहीं) जेनेरिक कार्यों की घोषणा करते समय मैं उपयोग कर सकता था?

उत्तर

4

लक्षण आमतौर पर अपरकेस होते हैं। इस मामले में यह Ord है। देखें कि क्या मदद करता है।

+0

आपको संख्या जोड़ने के लिए आपको एक विशेषता की भी आवश्यकता होगी। जब तक मैंने इसे देखा नहीं, तब तक यह बदल गया है, मुझे लगता है कि आप न्यूम विशेषता चाहते हैं। आपको अपना 1 शाब्दिक सही प्रकार में प्राप्त करने के लिए से_इन से कॉल करने की भी आवश्यकता हो सकती है। –

4

वर्तमान मास्टर में, 'न्यू' नामक एक विशेषता है जो सभी संख्यात्मक प्रकारों के लिए सामान्य विशेषता के रूप में कार्य करती है। विशेष रूप से u8, f32, आदि की बजाय इस विशेषता पर काम करने के लिए कई सामान्य गणित कार्यों को एकीकृत करने के लिए कार्य किया गया है।

उपरोक्त न्यूम विशेषता के लिए https://github.com/mozilla/rust/blob/master/src/libstd/num/num.rs#L26 देखें।

आशा है कि इससे मदद मिलती है!

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