2013-04-05 6 views
14

मैं जंग में सभी पूर्णांक वाले एक सूची का उत्पादन कैसे करूं? मैं हास्केल के [n..m] या पायथन के range(n, m+1) के समतुल्य की तलाश में हूं लेकिन कुछ भी नहीं मिला।जंग में, हास्केल के बेवकूफ समकक्ष क्या है [एन..एम]?

मुझे int::range फ़ंक्शन के बारे में पता है और मैंने सोचा कि यह वही था जो मैं ढूंढ रहा था, लेकिन इसे एक श्रृंखला में फिर से बनाने के लिए बनाया गया है, इसे न उत्पादन करने के लिए।

+1

ध्यान रखें कि हास्केल के आलसी मूल्यांकन के कारण, इसकी सूची प्रकार में वास्तव में एक तत्व और एक कार्य होता है जो शेष सूची (यानी, अगला तत्व और * अगला * फ़ंक्शन, और इसी तरह) का उत्पादन जारी रखने के लिए होता है, जिसका अर्थ यह है कि कई तरीकों से जंग के 'इटरेटर' प्रकार वास्तव में 'Vec ' की तुलना में हास्केल की '[ए]' के लिए एक करीबी मैच हैं। – glaebhoerl

उत्तर

7

नोट है कि इस सवाल का जवाब जंग का एक पूर्व 1.0 संस्करण से संबंधित है और 1.0 के लिए लागू नहीं होता। विशेष रूप से, std::iter::range और std::iter::range_inclusive हटा दिए गए थे। range और range_inclusive है, जो सीमा में संख्या की सूची तैयार iterators वापसी [कम:

जंग 1.0.0-अल्फा के रूप में, सबसे आसान तरीका है यह पूरा करने के मॉड्यूल std::iter में प्रदान की सुविधा कार्यों का उपयोग करने के लिए है , उच्च) या [निम्न, उच्च] क्रमशः।

इसके अलावा, आप collect विधि का उपयोग कर एक पुनरावर्तक से एक सदिश का निर्माण कर सकते हैं:

use std::iter::range_inclusive; 
let first_hundred: Vec<i32> = range_inclusive(1, 100).collect(); 
println!("upper bound inclusive: {:?}, exclusive: {:?}", 
     first_hundred, 
     range(101, 201).collect::<Vec<_>>()); 

ध्यान दें कि collect के रिटर्न मान अपने प्रकार स्पष्ट रूप से ऊपर दोनों इसके उपयोग में निर्दिष्ट है। आम तौर पर, जंग कम्पाइलर स्पष्ट विनिर्देश के बिना अभिव्यक्ति के प्रकारों का अनुमान लगा सकता है, लेकिन collect इस मामले में पूरी तरह से अनुमानित नहीं किया जा सकता है, क्योंकि इस मामले में यह एक ठोस प्रकार का अनुमान नहीं लगा सकता है जो विशेषता को लागू करता है FromIterator<A>, वापसी का प्रकार collect

जेनेरिक रिटर्न वैल्यू के प्रकार को let परिभाषा विवरण या function::<Type>() सिंटैक्स का उपयोग करके इनलाइन को स्पष्ट प्रकार के रूप में निर्दिष्ट किया जा सकता है। चूंकि अनुमान FromIterator<A> को लागू करने वाले ठोस प्रकार को जानने के कारण विफल रहता है, इसलिए यह संभव है कि, सामान्य प्रकार को स्पष्ट रूप से निर्दिष्ट करते समय, अनुमानित तर्कों के लिए "छेद" छोड़ने के लिए, अनुमानित किया जाएगा, _ द्वारा दर्शाया गया है। यह दूसरा अभिव्यक्ति Vec<_> में — ऊपर collect करने के लिए कॉल के साथ किया जाता है, यह स्पष्ट रूप से निर्दिष्ट है कि कंटेनर collect से तत्वों प्राप्त एक Vec<T> है, लेकिन संकलक का पता लगा लेता क्या सही प्रकार T होना चाहिए। वर्तमान में, जिनके प्रकारों को अनिर्दिष्ट छोड़ दिया गया है और अनुमानित नहीं किया जा सकता है, वे डिफ़ॉल्ट रूप से i32 (32-बिट मशीन पूर्णांक) पर आते हैं।

10

नोट है कि इस सवाल का जवाब एक पूर्व 1.0 जंग के संस्करण से संबंधित है और 1.0 के लिए लागू नहीं होता। विशेष रूप से, Vec::from_fn हटा दिया गया था।

शायद अब तक वास्तव में कुछ भी मूर्ख नहीं है। वहाँ सुविधा कार्यों में से एक मुट्ठी भर वैक्टर के निर्माण के लिए, उदाहरण के लिए आप Vec::from_fn उपयोग कर सकते हैं:

Vec::from_fn(m+1-n, |i| i+n) 
+0

धन्यवाद! मैं इसका इस्तेमाल करूंगा। – Fabien

+0

आप काउंटर को थोड़ा अधिक मूर्खतापूर्ण पाएंगे। http://static.rust-lang.org/doc/std/iterator.html#struct- काउंटर – dcolish

12

अब यह जंग में .. उपयोग करना संभव है:

let vec: Vec<_> = (n .. m + 1).collect(); 

आप n से m के सभी नंबरों से एक Vec देता है।

जैसा कि शेम्प्स्टर द्वारा टिप्पणी में उल्लेख किया गया है, सावधान रहें, यदि आपको प्रकार के अधिकतम मूल्य (255u8 के लिए) की आवश्यकता है तो यह काम नहीं करेगा।

+6

* से 'एम' समावेशी * - पैडेंटिक रूप से, यह वास्तव में समावेशी नहीं है। उदाहरण के लिए, सभी 'u8' मान 0 से 255 तक प्राप्त करने का कोई आसान तरीका नहीं है। इसमें कई आरएफसी हैं जो एक समावेशी रेंज ऑपरेटर जोड़ने का प्रस्ताव रखते हैं। – Shepmaster

+1

इसे 've vec = Vec :: from_iter (n .. m + 1)' के रूप में भी लिखा जा सकता है। – malbarbo

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