रनटाइम बिल्डिंग: स्ट्रिंग इस दायरे में नहीं मिली

Dec 18 2020

एक सामान्य समस्या सब्सट्रेट डेवलपर्स में चल सकती है: मानचित्रण को सामान्य प्रकारों के साथ स्टोर करने के लिए कस्टम पैलेट विकसित करना, जैसे कि String। उदाहरण के तौर पे:

#[derive(Encode, Decode, Clone, Default, RuntimeDebug)]
pub struct ClusterMetadata {
    ip_address: String,
    namespace: String,
    whitelisted_ips: String,
}

रनटाइम बनाने पर, आपको यह त्रुटि हर के लिए मिलती है String:

     |
  21 |     ip_address: String,
     |                 ^^^^^^ not found in this scope

Stringsदायरे में शामिल क्यों नहीं हैं ? और अन्य stdजंग प्रकार?

जवाब

4 ShawnTabrizi Dec 18 2020 at 07:35

यहां त्रुटि से संबंधित नहीं है no_std, इसलिए आपको शायद Stringरनटाइम में स्ट्रिंग्स का उपयोग करके वास्तविक त्रुटियों को प्राप्त करने के लिए प्रकार को आयात करना होगा ।

वास्तविक मुद्दा जो आप पाएंगे, वह Stringहै Parity SCALE Codec, जो स्पष्ट रूप से रनटाइम में किसी भी स्टोरेज आइटम (या आपके द्वारा उपयोग किए जाने वाले किसी भी प्रकार का उपयोग करना चाहते हैं) के लिए एक आवश्यकता नहीं है।

तो सवाल यह है कि "SCALE सांकेतिक शब्दों में बदलना क्यों नहीं करता है String"?

यह चुनाव द्वारा है। सामान्य तौर पर, Stringआश्चर्यजनक रूप से जटिल प्रकार है। रस्ट किताब एक पूरे खंड को खर्च करती है जो कि प्रकार की जटिलताओं के बारे में बात करती है ।

जैसे, यह रनटाइम वातावरण में आसानी से एक फुटगन बन सकता है जो लोग Stringगलत तरीके से उपयोग करते हैं ।

इसके अलावा, यह आमतौर पर Stringरनटाइम स्टोरेज में स्टोर करने के लिए बुरा अभ्यास है । मुझे लगता है कि हम आसानी से सहमत हो सकते हैं कि रनटाइम में स्टोरेज का उपयोग कम से कम करना एक सर्वोत्तम अभ्यास है, और इस प्रकार आपको केवल स्टोरेज आइटम में रखना चाहिए, जिसे आपको अपने रनटाइम में सर्वसम्मति और राज्य परिवर्तन प्राप्त करने में सक्षम होना चाहिए। सबसे अधिक बार, Stringडेटा का उपयोग मेटाडेटा के लिए किया जाएगा, और इस तरह का उपयोग सबसे अच्छा अभ्यास नहीं है।

यदि आप सबस्ट्रेट को अधिक बारीकी से देखते हैं, तो आप पाएंगे कि हम इस सर्वोत्तम अभ्यास को एक से अधिक बार तोड़ते हैं, लेकिन यह एक ऐसा निर्णय है जिसे हम स्पष्ट रूप से करते हैं, जिसकी जानकारी लागत / लाभ का सही मूल्यांकन करने में सक्षम होना है।

यह सब इसीलिए Stringहै क्योंकि रनटाइम में प्रथम श्रेणी की वस्तु के रूप में व्यवहार नहीं किया जाता है। इसके बजाय, हम उपयोगकर्ताओं को बाइट्स में स्ट्रिंग्स को एनकोड करने के लिए कहते हैं, और उसके बजाय उस बाइट सरणी के साथ काम करते हैं।