क्या यह राकू के डिजाइन का इरादा है?
यह कहना उचित है कि Raku इस क्षेत्र में पूरी तरह से अनधिकृत नहीं है। आपका प्रश्न रक्कू के डिजाइन में दो विषयों को छूता है, जो दोनों थोड़ी चर्चा के लायक हैं।
Raku में प्रथम श्रेणी के एल-मान हैं
Raku प्रथम श्रेणी की चीज होने के कारण l-मानों का भरपूर उपयोग करता है। जब हम लिखते हैं:
has $.x is rw;
उत्पन्न विधि है:
method x() is rw { $!x }
is rw
यहाँ इंगित करता है कि विधि एक लौटा रहा है l-मूल्य - यह है कि, कुछ ऐसा है जो करने के लिए सौंपा जा सकता है। इस प्रकार जब हम लिखते हैं:
$obj.x = 42;
यह सिंटैक्टिक चीनी नहीं है: यह वास्तव में एक विधि कॉल है, और फिर असाइनमेंट ऑपरेटर को इसके परिणाम पर लागू किया जा रहा है। यह काम करता है, क्योंकि विधि कॉल Scalar
विशेषता के कंटेनर को लौटाता है , जिसे बाद में सौंपा जा सकता है। यह दो चरणों में विभाजित करने के लिए बाध्यकारी का उपयोग कर सकता है, यह देखने के लिए कि यह एक तुच्छ वाक्यविन्यास परिवर्तन नहीं है। उदाहरण के लिए, यह:
my $target := $obj.x;
$target = 42;
ऑब्जेक्ट विशेषता को असाइन करना होगा। सूची असाइनमेंट सहित कई अन्य सुविधाओं के पीछे भी यही तंत्र है। उदाहरण के लिए, यह:
($x, $y) = "foo", "bar";
एक का निर्माण करके काम करता है List
कंटेनर युक्त $x
और $y
, और फिर इस मामले में असाइनमेंट ऑपरेटर काम करने के लिए प्रत्येक पक्ष जोड़ो में iterates। इसका मतलब है कि हम rw
वहां ऑब्जेक्ट एक्सेसर्स का उपयोग कर सकते हैं :
($obj.x, $obj.y) = "foo", "bar";
और यह सब स्वाभाविक रूप से काम करता है। ऐरे और हैश के स्लाइस को असाइन करने के पीछे भी यही तंत्र है।
एक Proxy
एल-मूल्य कंटेनर बनाने के लिए भी उपयोग कर सकते हैं जहां इसे पढ़ने और लिखने का व्यवहार आपके नियंत्रण में है। इस प्रकार, आप साइड-एक्शन डाल सकते हैं STORE
। तथापि...
Raku "बसने" पर सिमेंटिक तरीकों को प्रोत्साहित करता है
जब हम OO का वर्णन करते हैं, तो "एनकैप्सुलेशन" और "डेटा हाइडिंग" जैसे शब्द अक्सर सामने आते हैं। यहां मुख्य विचार यह है कि वस्तु के अंदर स्थित राज्य मॉडल - अर्थात, जिस तरह से वह डेटा का प्रतिनिधित्व करने के लिए चुनता है, उसे अपने व्यवहारों (विधियों) को लागू करने के लिए - विकसित करने के लिए स्वतंत्र है, उदाहरण के लिए नई आवश्यकताओं को संभालने के लिए। वस्तु जितनी जटिल होती है, उतनी ही मुक्त होती है।
हालांकि, गेटर्स और सेटर ऐसे तरीके हैं जिनका राज्य के साथ एक अंतर्निहित संबंध है। जब हम दावा कर सकते हैं कि हम डेटा छिपा रहे हैं क्योंकि हम एक विधि को कॉल कर रहे हैं, सीधे राज्य तक नहीं पहुंच रहे हैं, मेरा अनुभव यह है कि हम जल्दी से एक जगह पर समाप्त हो जाते हैं जहां बाहरी कोड एक ऑपरेशन को प्राप्त करने के लिए सेटर कॉल के अनुक्रम बना रहा है - जो है सुविधा का एक रूप एंटी-पैटर्न से ईर्ष्या करता है। और यदि हम कर रहे हैं कि , यह बहुत कुछ हम उद्देश्य यह है कि एक ऑपरेशन को प्राप्त करने के गेटर और सेटर संचालन का मिश्रण होता है के तर्क के बाहर के साथ खत्म हो जाएगा। वास्तव में, इन परिचालनों को उन नामों के तरीकों के रूप में उजागर किया जाना चाहिए जो वर्णन करता है कि क्या हासिल किया जा रहा है। यदि हम समवर्ती सेटिंग में हैं तो यह और भी महत्वपूर्ण हो जाता है; विधि सीमा पर सुरक्षा के लिए एक अच्छी तरह से डिज़ाइन की गई वस्तु अक्सर काफी आसान होती है।
उस ने कहा, class
वास्तव में रिकॉर्ड / उत्पाद प्रकार के कई उपयोग हैं: वे केवल डेटा आइटम का एक समूह के साथ समूह के लिए मौजूद हैं। यह कोई दुर्घटना नहीं है कि .
सतर्क केवल एक सहायक उत्पन्न नहीं करता है, बल्कि:
- डिफ़ॉल्ट ऑब्जेक्ट आरंभीकरण तर्क (जो है, के
class Point { has $.x; has $.y; }
रूप में त्वरित किया जा सकता है Point.new(x => 1, y => 2)
) द्वारा निर्धारित किया जा रहा है , और .raku
डंपिंग विधि में भी प्रदान करता है कि विशेषता को खोलता है।
- विशेषता को डिफ़ॉल्ट
.Capture
ऑब्जेक्ट में बदल देता है, जिसका अर्थ है कि हम इसे विनाशकारी (जैसे sub translated(Point (:$x, :$y)) { ... }
) में उपयोग कर सकते हैं ।
यदि आप एक और अधिक प्रक्रियात्मक या कार्यात्मक शैली में लिख रहे थे और class
रिकॉर्ड प्रकार को परिभाषित करने के लिए एक साधन के रूप में उपयोग कर रहे थे, तो आप क्या चाहते हैं ।
Raku डिजाइन बसने में चालाक चीजों को करने के लिए अनुकूलित नहीं है, क्योंकि यह एक खराब चीज माना जाता है जिसके लिए अनुकूलन करना है। यह एक रिकॉर्ड प्रकार के लिए आवश्यक है से परे है; कुछ भाषाओं में हम तर्क दे सकते हैं कि जो कुछ सौंपा जा रहा है, उसका सत्यापन हम करना चाहते हैं, लेकिन Raku में हम उसके लिए subset
टाइप कर सकते हैं । उसी समय, यदि हम वास्तव में एक OO डिजाइन कर रहे हैं, तो हम सार्थक व्यवहार की एक एपीआई चाहते हैं जो राज्य मॉडल को छुपाता है, बल्कि गेटर्स / सेटर के संदर्भ में सोचता है, जो कॉलोकेट करने में विफलता का कारण बनता है डेटा और व्यवहार, जो कि वैसे भी OO करने की बात है।