मुख्य कंटेंट तक स्किप करें

स्ट्रक्चर

सारांश

वेव भाषा में स्ट्रक्चर उपयोगकर्ता परिभाषित डेटा प्रकारों की घोषणा के लिए एक मुख्य वाक्य रचना तत्व है। स्ट्रक्चर का उपयोग करके विभिन्न प्रकार के मानों को एक तार्किक इकाई के रूप में समूहीकृत किया जा सकता है, जिससे जटिल डेटा संरचनाओं को स्पष्ट और सुरक्षित रूप से मॉडलिंग किया जा सकता है।

वेव के स्ट्रक्चर मूल्य प्रकार (वैल्यू टाइप) के रूप में कार्य करते हैं। सभी फील्ड्स के पास स्पष्ट प्रकार होना चाहिए और स्ट्रक्चर की एक इकाई बनाते समय सभी फील्ड्स को अनिवार्य रूप से प्रारंभिक किए जाना चाहिए। इन नियमों के माध्यम से स्ट्रक्चर की स्थिति हमेशा पूर्ण और पूर्वानुमान योग्य स्वरूप बनाए रखती है।

स्ट्रक्चर घोषणा वाक्य रचना

स्ट्रक्चर को struct कीवर्ड का उपयोग करके घोषित किया जाता है। स्ट्रक्चर का नाम पास्कल केस (PascalCase) का उपयोग करता है और स्ट्रक्चर के अंदर एक या अधिक फील्ड्स को परिभाषित किया जा सकता है।

फील्ड्स को नाम: प्रकार; प्रारूप में घोषित किया जाता है और प्रत्येक फील्ड घोषणा के बाद एक अनिवार्य सेमीकोलन की आवश्यकता होती है।

struct Box {
size: i32;
weight: f32;
}

स्ट्रक्चर घोषणा के दौरान फील्ड्स का क्रम मेमोरी रिज़र्वेशन क्रम से मेल खाता है। स्ट्रक्चर के अंदर केवल फील्ड घोषणाएँ अनुमति दी जाती हैं, और कोई फ़ंक्शन या मेथड शामिल नहीं किया जा सकता। कार्य तर्क या लॉजिक स्ट्रक्चर के बाहर अलग से परिभाषित किया जाता है।

स्ट्रक्चर निर्माण वाक्य रचना

स्ट्रक्चर को स्ट्रक्चर नाम का उपयोग करके एक लिटेरल रूप में बनाते हैं। स्ट्रक्चर लिटेरल StructName { फील्ड नाम: मान; ... } रूप में लिखें।

var b: Box = Box {
size: 42;
weight: 10.5;
};

स्ट्रक्चर को बनाते समय परिभाषित सभी फील्ड्स को अनिवार्य रूप से प्रारंभिक किया जाना चाहिए, यदि कोई भी फील्ड छूट जाता है तो यह संकलन त्रुटि का कारण बनेगा।

प्रारंभिक करते समय फील्ड के लेखन क्रम को स्ट्रक्चर के घोषणा क्रम से मेल खाना जरूरी नहीं है, लेकिन हर फील्ड को सौंपे गए मान का प्रकार स्ट्रक्चर में परिभाषित प्रकार से बिल्कुल मेल खाना चाहिए। वेव में स्ट्रक्चर फील्ड के प्रारंभिकरण के दौरान किसी प्रकार की अप्रकट प्रकारांतरण की अनुमति नहीं है।


स्ट्रक्चर फील्ड अभिगम वाक्य रचना

स्ट्रक्चर के फील्ड्स में डॉट नोटेशन के माध्यम से पहुँचा जाता है। फील्ड पहुंच हेतु पढ़ाई और लिखाई के लिए समान वाक्य रचना का उपयोग होता है।

println("Size: {}", b.size);
println("Weight: {}", b.weight);

यदि आप असामान्य फील्ड नाम का उपयोग करते हैं, तो संकलन चरण में त्रुटि उत्पन्न होती है। क्योंकि संरचना एक वैल्यू प्रकार है, संरचना को पूरी तरह से निर्दिष्ट करने या फ़ंक्शन पैरामीटर के रूप में पास करने पर संरचना के सभी फील्ड्स को एक साथ कॉपी किया जाता है।


स्ट्रक्चर मेथड परिभाषा वाक्य रचना

वेव भाषा में संरचना के अंदर सीधे तरीके को परिभाषित नहीं किया जाता है। इसके बजाय संरचना से जुड़े तरीके के सेट को घोषित करने के लिए proto कीवर्ड का उपयोग करें।

proto ब्लॉक विशेष संरचना से जुड़े कार्यों का क्षेत्र होता है, इस ब्लॉक में परिभाषित कार्यों का उपयोग उस संरचना के तरीके के रूप में किया जाता है।

विधि की पहली पैरामीटर के रूप में self का उपयोग करके संरचना की अनुकरण प्राप्त की जाती है। self संरचना के संपूर्ण मूल्य का अर्थ है और यह वैल्यू कॉपी विधि द्वारा पास किया जाता है।

proto Box {
fun print(self) {
println("size={}, weight={}", self.size, self.weight);
}

fun added_size(self, x: i32) -> i32 {
return self.size + x;
}
}

proto ब्लॉक को संरचना घोषणा के समान फाइल में स्थान नहीं करना होता है, विभिन्न proto ब्लॉकों के माध्यम से एक ही संरचना के तरीकों को विभाजित कर सकते हैं।

विधि को बिंदु नोटेशन का उपयोग करके बुलाया जाता है, और सामान्य फ़ंक्शन कॉल की तरह ही कार्य करता है।

b.print();
var n: i32 = b.added_size(5);

एक फ़ंक्शन पैरामीटर के रूप में स्ट्रक्चर का उपयोग

स्ट्रक्चर को फंक्शन पैरामीटर के रूप में पास करते समय वैल्यू कॉपी पद्धति का उपयोग किया जाता है। फंक्शन के अंदर संरचना के फील्ड्स को संशोधित करने पर भी, इसे कॉल करने वाले की संरचना की अनुकरण पर कोई प्रभाव नहीं पड़ता है।

fun calc(box: Box) -> i32 {
return box.size * 2;
}

स्ट्रक्चर को फंक्शन के वापसी मूल्य के रूप में उपयोग करने पर भी वैल्यू कॉपी होती है। यह क्रिया संरचना की अपरिवर्तनीयता और पूर्वानुमानित डेटा प्रवाह को सुनिश्चित करती है।


नेस्टेड संरचना

वेव में संरचना के फील्ड प्रकार के रूप में अन्य संरचना का उपयोग किया जा सकता है। क्योंकि संरचना एक संपूर्ण प्रकार है, इसे एक नई संरचना के रूप में आसानी से सम्मिलित किया जा सकता है।

struct Position {
x: i32;
y: i32;
}

struct Player {
name: str;
pos: Position;
}

नेस्टेड संरचना का फील्ड बिंदु अथवा डॉट नोटेशन के माध्यम से लगातार उपयोग करके प्राप्त होता है।

var p: Player = Player {
name: "Alice";
pos: Position { x: 10; y: 20; };
};

println("Player X: {}", p.pos.x);
println("Player Y: {}", p.pos.y);

संरचना लिटरल्स के अंदर एक और संरचना लिटरल को नेस्ट किया जा सकता है, इस मामले में भी सभी फील्ड इनिशियलाइजेशन नियम समान रहते हैं।


स्ट्रक्चर ऐरे

संरचना को ऐरे के तत्व प्रकार के रूप में उपयोग किया जा सकता है। वेव के ऐरे की वाक्य रचना array<प्रकार, लंबाई> फॉर्मेट का उपयोग करती है, और संरचना प्रकार को भी ऐसे ही निर्दिष्ट किया जा सकता है।

var players: array<Player, 3> = [
Player { name: "A"; pos: Position { x: 1; y: 2; }; },
Player { name: "B"; pos: Position { x: 3; y: 4; }; },
Player { name: "C"; pos: Position { x: 5; y: 6; }; }
];

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

println("Second Player X: {}", players[1].pos.x);

स्ट्रक्चर के मूल संचालन की संभाव्यता

वेव में संरचना उपयोगकर्ता परिभाषित प्रकार होती है, इसलिए यह स्वचालित रूप से अंकगणितीय संचालन या तुलना संचालन में भाग नहीं लेती है।

यदि संरचना की समानता तुलना, आदेश, हैशिंग, गणना संचालन आदि की आवश्यकता है, तो इसे proto ब्लॉक के माध्यम से स्पष्ट रूप से परिभाषित करना होगा। वेव संरचना के लिए कोई निहित ऑपरेटर प्रदान नहीं करता, और सभी कार्यों को स्पष्ट रूप से परिभाषित करने का सिद्धांत रखता है।