2017-04-23 4 views
8

एक जंक्शन my $j = 1 | 2 | 3 | 4 | 5 परिभाषित करें, अब मैं इसके मूल्य [1 2 3 4 5] की एक सरणी प्राप्त करना चाहता हूं, मुझे इसे कैसे कार्यान्वित करना चाहिए?एक जंक्शन में मान को सरणी के रूप में कैसे वापस करें?

मैंने $j.values की कोशिश की लेकिन पर्ल 6 ने मुझे एक तत्व के रूप में पूरा जंक्शन दिया: [any((1), (2), (3), (4), (5))]

+2

[प्रलेखन] के अनुसार (https://docs.perl6.org/type/Junction): * "जंक्शन का उपयोग बूलियन संदर्भ में मैचर्स के रूप में किया जाना है; जंक्शनों का आत्मनिरीक्षण समर्थित नहीं है। अगर आपको लगता है कि एक जंक्शन का आत्मनिरीक्षण करने का आग्रह करें, इसके बजाय सेट या संबंधित प्रकार का उपयोग करें। "* –

उत्तर

6

Håkon Hægland जैसा कि पहले ही, कहा यह कुछ आप क्या करना चाहिए रहे हैं नहीं है:

जंक्शनों बूलियन संदर्भ में matchers के रूप में इस्तेमाल किया जा के लिए होती हैं; जंक्शन का आत्मनिरीक्षण समर्थित नहीं है। यदि आप एक जंक्शन का आत्मनिरीक्षण करने का आग्रह महसूस करते हैं, तो इसके बजाय सेट या संबंधित प्रकार का उपयोग करें।

  - docs.perl6.org/type/Junction

हालांकि, यह संभव है।

सबसे पहले, आप authothreading उपयोग कर सकते हैं (यानी एक जंक्शन की प्रत्येक शाखा जब एक समारोह है कि प्रकार Any की एक बहस की उम्मीद के लिए पारित का स्वत: मूल्यांकन):

sub unjunc(Junction $j) { 
    gather -> Any $_ { .take }.($j); 
} 

दूसरे, आप हिम्मत में प्रहार कर सकते हैं और मैन्युअल रूप से मान एक्सट्रैक्ट:

sub unjunc(Junction $j) { 
    multi extract(Any $_) { .take } 
    multi extract(Junction $_) { 
     use nqp; 
     my $list := nqp::getattr($_, Junction, '$!storage'); 
     my int $elems = nqp::elems($list); 
     loop (my int $i = 0; $i < $elems; $i = $i + 1) { 
      extract nqp::atpos($list, $i); 
     } 
    } 
    gather extract $j; 
} 

यदि आपका जंक्शन गैर पुनरावर्ती है (यानी अन्य जंक्शनों आप समतल करना चाहते हैं शामिल नहीं है), बाद दृष्टिकोण सरल किया जा सकता:

my $j := 1|2|3; 
say nqp::p6bindattrinvres(nqp::create(List), List, '$!reified', 
    nqp::getattr($j, Junction, '$!storage')); 
9

यह जानबूझकर है, जहां तक ​​मुझे पता है।

$ जे की हैश की एक जंक्शन युक्त $ जे की कल्पना करें: फिर $ j.values ​​सेक के हैश स्वयं का जंक्शन होगा।

आप एक जंक्शन की सरणी चाहते हैं, तो हो सकता है आप एक सरणी से कि से बाहर शुरू कर देना चाहिए, और निर्माण एक जंक्शन:

my @a = 1,2,3,4,5; 
my $j = any(@a); 

आप वास्तव में जंक्शन जाना चाहते हैं -> सरणी रास्ता, आप कर सकते हैं, लेकिन इसमें nqp का उपयोग करना शामिल होगा, और ऐसा कुछ है जो मैं उपयोगकर्तालैंड कोड में अनुशंसा नहीं करता।

+0

इसे और भी सरल बनाया जा सकता है: ' मेरा $ j = कोई भी मेरा @ ए = 1,2,3,4,5; ' – ab5tract

संबंधित मुद्दे