Vec <Vec <u8 >> को और [[[u8]] [डुप्लिकेट] में बदलें

Nov 08 2020

मेरे पास एक फ़ंक्शन है जो कुछ संख्या में बाइट स्ट्रिंग्स लेता है: &[&[u8]]लेकिन इसे प्रकार के तर्क के साथ कॉल करना चाहते हैं Vec<Vec<u8>>। फ़ंक्शन को इस तरह से कॉल करना:

let foo: Vec<Vec<u8>> = Vec::new();
bar(&foo[..]);

fooएक स्लाइस में परिवर्तित होता है, लेकिन इसमें वे मूल्य नहीं होते हैं। क्या इस रूपांतरण को आसानी से और कुशलता से करने का कोई तरीका है? या मैं इस तरह के मामलों से बचने के लिए फ़ंक्शन तर्क के प्रकार को बदल सकता हूं?

जवाब

2 L.F. Nov 08 2020 at 19:35

एक अतिरिक्त आवंटन के बिना इस मामले को संभालने का एक तरीका Vecउपयोग करना है AsRef<[u8]>:

fn bar<S: AsRef<[u8]>>(args: &[S]) {
    // ...
}

फ़ंक्शन के अंदर, आप .as_ref()प्रत्येक तर्क को a में कनवर्ट करने के लिए उपयोग कर सकते हैं &[u8]

( खेल का मैदान )

2 Locke Nov 08 2020 at 16:11

मेमोरी के नजरिए से यह बहुत मायने नहीं रखता है। स्लाइस बनाने के लिए, स्लाइस किए जा रहे डेटा को पहले मेमोरी में मौजूद होना चाहिए। हालाँकि &[u8], एक स्लाइस लेने के लिए , आपको पहले कुछ डेटा संरचना की आवश्यकता होती है जैसे Vec<&[u8]>कि स्लाइस लेना।

ऐसा करने के लिए दूसरे शब्दों में, आपको पहले स्लाइस के साथ Vec<&[u8]>या इसके लिए जगह आवंटित करने की आवश्यकता है [&[u8]; N]। यह कुछ हद तक स्लाइस का उपयोग करने के उद्देश्य को हरा देता है क्योंकि स्लाइस जगह में मौजूदा संदर्भ मेमोरी के लिए हैं। &[Vec<u8>]इसके बजाय अपने फ़ंक्शन के लिए उपयोग करने पर विचार करें ।

तो दूसरी परत में स्लाइस होने के लिए महत्वपूर्ण है या आप समारोह आप कर सकते हैं संपादित करने में असमर्थ हैं कन्वर्ट करने के लिए निम्नलिखित Vec<Vec<u8>>करने के लिए &[&[u8]]:

let foo: Vec<Vec<u8>> = Vec::new();

// Allocate Vec of references to slices
let tmp: Vec<&[u8]> = foo.iter().map(|x| &x[..]).collect();

// Take slice of temporary Vec
bar(&tmp[..]);