राकु में पैरामीटर प्रकार, पैरामीटर के रूप में रन टाइम मान का उपयोग कैसे करें

Nov 28 2020

मैं रकु के लिए कुछ पैरामीट्रेटेड प्रकार बनाना चाहूंगा ; मूल रूप से, मैं कुछ अलग वर्ग बनाना चाहूँगा जिनका मुख्य अंतर इसकी विशेषताओं में से एक के मूल्यों की सीमा होगी; उदाहरण के लिए, कक्षाएं इमारत के प्रकारों का प्रतिनिधित्व करती हैं, मैं 3 या किसी भी अन्य मंजिलों वाली इमारतों के लिए अलग-अलग कक्षाएं लेना चाहूंगा। तो यह सबसे अच्छा मैं के बारे में सोच सकता है:

subset Two-Tops of UInt where * <=2;
subset Three-Tops of UInt where * <=3;

role Zipi[ ::Capper ] {
    has Capper $.floor; } class Capped-at-three does Zipi[Three-Tops] {} my $capped = Capped-at-three.new( floor => 2 );
say $capped.raku;

यह स्पष्ट रूप से अव्यावहारिक है जैसे ही आपको कई अलग-अलग मंजिलों की देखभाल करने की आवश्यकता होती है (ग्रेनेडा में यहां नहीं, जहां उनके पास अधिकतम 10 हैं, मुझे लगता है, लेकिन अच्छी तरह से ...)। यहां समस्या यह है कि मूल रूप से आपको संकलन के समय सबसे पहले सबसेट की जानकारी होनी चाहिए, इसलिए जब तक आप मैक्रोज़ (अभी भी प्रायोगिक) का उपयोग नहीं करते हैं, तब तक कोई रास्ता नहीं है कि आप किसी भी प्रकार के चर का उपयोग कर सकें। तो क्या आप पैरामीटर के किसी भी मूल्य के लिए इस तरह की करी भूमिकाओं को परिभाषित करने का एक व्यावहारिक तरीका सोच सकते हैं ?

जवाब

8 user0721090601 Nov 28 2020 at 15:51

वास्तव में, इसके विपरीत मैंने अपने पिछले में कहा था कि आप ऐसी परिस्थितियों का उपयोग कर सकते हैं जहां बिना किसी समस्या के धाराएँ हैं, आपको बस उन्हें ब्रेसिज़ में संलग्न करने की आवश्यकता है:

role Zipi[$condition] { has $.floor is rw where {$_ ~~ $condition}
    method foo($x) { $!floor = $x } } class A does Zipi[2 < * < 5] { method bar($x) { $.floor = $x }
}

#my $a = A.new( floor => 10); # error my $a = A.new( floor => 4); # OK

#$a.foo(10); # error $a.foo(3); # OK

#$a.bar(0); # error $a.bar(4); # OK

#$a.floor = 9; # error $a.floor = 3; # OK

यह असाइनमेंट के सभी प्रकारों को कवर करना चाहिए

5 raiph Nov 28 2020 at 04:15

मेरे पास बहुत सीमित एमओपी चॉप है, और निम्नलिखित बदसूरत लगता है, लेकिन यह काम करता है, और सही दिशा में एक कदम हो सकता है।

मैंने क्या किया:

  • subsetMOP के माध्यम से गतिशील रूप से 10,000 एस की एक सरणी का निर्माण किया ।

  • समय ने उनके निर्माण को समय के माध्यम से संकलित करने के लिए स्थानांतरित कर दिया BEGIN

  • भूमिका को पैरामीटर करने के लिए सरणी से एक उपयुक्त तत्व का उपयोग किया।

my @max-floors-checkers; 
BEGIN {
  @max-floors-checkers = do for ^10_000 -> \floors {
    Metamodel::SubsetHOW.new_type: 
      refinee => UInt,
      refinement => { $^floors <= floors } } } role BuildingCategory[ ::MaxFloorsCheck ] { has MaxFloorsCheck $.floors }
    
class Capped-at-three does BuildingCategory[ @max-floors-checkers[3] ] {}

my $capped3 = Capped-at-three.new( floors => 2 ); say $capped3.raku;                                # Capped-at-three.new(floors => 2

my $capped4 = Capped-at-three.new( floors => 4 ); # Type check failed 
3 user0721090601 Nov 28 2020 at 01:40

मैंने अनाम whereखंडों का उपयोग करने की कोशिश की , लेकिन इसी तरह कोई फायदा नहीं हुआ, लेकिन मैंने इस मुद्दे को ट्रैक किया: whereखंड को स्पष्ट रूप से BUILDविधि द्वारा अनदेखा किया जा रहा है । मुझे यकीन नहीं है कि अगर ऐसा है क्योंकि इसका सीधा उपयोग ( $!floorथ्रू) है जो whereखंड को दरकिनार करता है, या यदि कुछ और अजीब चल रहा है (शायद बाद वाला, मुझे सामान्य मिला Nilअगर मैंने एक whereखंड में पैरामैटराइज़्ड मूल्य का उपयोग करने की कोशिश की )।

फिर भी, यह अच्छी तरह से काम करना चाहिए, जिसमें एक उपयोगी त्रुटि संदेश देना शामिल है:

role Zipi[$condition] {
    has $.floor; submethod BUILD(:$floor, |c) {
        die "Invalid floor number."
            unless $floor ~~ $condition;
        $!floor = $floor;
    }
}

आप देख सकते हैं कि अगर आपको लगता है कि फर्श हमेशा के लिए हैं 0 .. x, या इसे x .. yऔर भी अधिक उपयोगी त्रुटि संदेश प्रदान कर सकते हैं, तो इसे संशोधित करना कितना आसान होगा ।

1 raiph Nov 29 2020 at 21:38

मामले को कवर करने वाला एक एनएवी एक पाठक जावा को जानता है लेकिन राकू को नहीं।

Collection<String> coll = new LinkedList<String>();

राकु के लिए पैरामीट्रिक प्रकार

लिंक किया गया जावा उदाहरण है:

वास्तविक प्रकार के तर्कों के साथ सामान्य प्रकार की तात्कालिकता को एक पैरामीटर प्रकार कहा जाता है। उदाहरण (एक पैरामीटर प्रकार का):

Collection<String> coll = new LinkedList<String>();

एक उचित Raku एनालॉग है:

my Positional[Str] \coll = Array[Str].new;

Positionalप्रकार एक parameterizable है भूमिका । एक भूमिका एक अंतरफलक और / या एक प्रकार का आंशिक कार्यान्वयन निर्दिष्ट करती है। मेरा मानना Positionalहै Collectionकि राकू का जावा के प्रति पर्याप्त रूप से सामंजस्य है और यह इस एनआरई के उद्देश्यों के लिए कार्य करता है।

Arrayप्रकार एक parameterizable है वर्ग । यह एक डेटा संरचना को निर्दिष्ट करता है जो Positionalभूमिका का पालन ​​करता है । यह एक लिंक की गई सूची नहीं है, लेकिन यह इस एनआईसी के उद्देश्यों के लिए पर्याप्त होगा।