Depset

यह एक खास तरह का डेटा स्ट्रक्चर होता है. इसमें डेटा को आसानी से मर्ज किया जा सकता है. साथ ही, इसमें डेटा को ट्रैवर्स करने का क्रम तय होता है. आम तौर पर, इसका इस्तेमाल नियमों और पहलुओं में ट्रांज़िटिव डिपेंडेंसी से डेटा इकट्ठा करने के लिए किया जाता है. ज़्यादा जानकारी के लिए, यहां जाएं.

किसी depset के एलिमेंट हैश किए जा सकने चाहिए और वे सभी एक ही टाइप के होने चाहिए. यह टाइप, बिल्ट-इन type(x) फ़ंक्शन से तय होता है. हालांकि, depsets सिर्फ़ हैश सेट नहीं होते और ये सदस्यता की जांच करने की सुविधा के साथ काम नहीं करते. अगर आपको सामान्य सेट डेटाटाइप की ज़रूरत है, तो कोर Starlark सेट टाइप का इस्तेमाल करें. यह Bazel 8.1 से उपलब्ध है. अगर आपकी .bzl फ़ाइल को Bazel के पुराने वर्शन के साथ काम करना है, तो डिक्शनरी का इस्तेमाल करके सेट को सिम्युलेट किया जा सकता है. इसमें सभी कुंजियां True पर मैप होती हैं.

जब किसी डीपसेट की जांच की जाती है (यानी कि जब इसका इस्तेमाल बूलियन कॉन्टेक्स्ट में किया जाता है, जैसे कि if d: जहां d एक डीपसेट है), तो डीपसेट तब सही होता है, जब वह खाली न हो. इस जांच में O(1) समय लगता है.

डिपसेट में बदलाव नहीं किया जा सकता. इन्हें इनके कंस्ट्रक्टर फ़ंक्शन का इस्तेमाल करके बनाया जाना चाहिए. साथ ही, transitive आर्ग्युमेंट के ज़रिए, इन्हें अन्य depsets के साथ मर्ज या बढ़ाया जाना चाहिए.

order पैरामीटर से यह तय होता है कि depset को इटरेटबल में बदलने के लिए किस तरह का ट्रैवर्सल किया जाता है. इन चार वैल्यू का इस्तेमाल किया जा सकता है:

  • "default" (पहले "stable"): ऑर्डर की जानकारी नहीं दी गई है (लेकिन तय है).
  • "postorder" (पहले "compile"): यह बाएं से दाएं क्रम में पोस्ट-ऑर्डरिंग करता है. यह फ़ंक्शन, सभी चाइल्ड एलीमेंट को बाईं ओर से दाईं ओर ले जाता है. इसके बाद, डायरेक्ट एलीमेंट को बाईं ओर से दाईं ओर ले जाता है.
  • "preorder" (पहले "naive_link"): इसमें बाएं से दाएं की ओर प्री-ऑर्डर किया जाता है. यह फ़ंक्शन, सबसे पहले सीधे तौर पर मौजूद एलीमेंट में सबसे बाईं ओर मौजूद एलीमेंट को ट्रैवर्स करता है. इसके बाद, यह फ़ंक्शन रिकर्सिव तरीके से चाइल्ड एलीमेंट में सबसे बाईं ओर मौजूद एलीमेंट को ट्रैवर्स करता है.
  • "topological" (पहले "link"): यह रूट से लेकर लीफ़ तक का टोपोलॉजिकल ऑर्डर होता है. इस बात की कोई गारंटी नहीं है कि टेक्स्ट को बाईं से दाईं ओर लिखा जाएगा.

दो depsets को सिर्फ़ तब मर्ज किया जा सकता है, जब दोनों depsets का क्रम एक जैसा हो या उनमें से किसी एक का क्रम "default" हो. दूसरे मामले में, नतीजे के तौर पर मिले डिसेट का क्रम, दूसरे डिसेट के क्रम जैसा ही होगा.

डिपसेट में डुप्लीकेट वैल्यू हो सकती हैं, लेकिन इन्हें दोहराते समय (to_list() का इस्तेमाल करके) छिपा दिया जाएगा. डुप्लीकेट वैल्यू, क्रम से जुड़ी सिमैंटिक में रुकावट डाल सकती हैं.

सदस्य

to_list

list depset.to_list()

यह फ़ंक्शन, depset के ट्रैवर्सल क्रम में मौजूद एलिमेंट की सूची दिखाता है. इसमें डुप्लीकेट एलिमेंट शामिल नहीं होते. ध्यान दें कि जिन एलिमेंट को डिफ़सेट में एक से ज़्यादा बार जोड़ा गया था उनके लिए, क्रम तय नहीं किया गया है. हालांकि, यह क्रम तय होता है. "default"-ऑर्डर किए गए depsets के लिए भी ऑर्डर तय नहीं किया गया है. साथ ही, उन चाइल्ड depsets के एलिमेंट के लिए भी ऑर्डर तय नहीं किया गया है जिनका ऑर्डर, पैरंट depset से अलग है. यह सूची एक कॉपी है. इसमें बदलाव करने से, depset पर कोई असर नहीं पड़ता. इसी तरह, depset में बदलाव करने से सूची पर कोई असर नहीं पड़ता.