2017-04-23 34 views
8

Zdefiniuj połączenie my $j = 1 | 2 | 3 | 4 | 5, teraz chcę uzyskać tablicę o jego wartości [1 2 3 4 5], w jaki sposób powinienem to wdrożyć?Jak zwrócić wartości w złączu jako tablicę?

Próbowałem $j.values, ale Perl6 dał mi cały węzeł jako element: [any((1), (2), (3), (4), (5))].

+2

Zgodnie z [dokumentacją] (https://docs.perl6.org/type/Junction): * "Połączenia są przeznaczone do użycia jako korektory w kontekście boolowskim, introspekcja połączeń nie jest obsługiwana. zachęcamy do introspekcji skrzyżowania, zamiast tego użyj zestawu lub pokrewnego typu. "* –

Odpowiedz

6

Jak Håkon Hægland już wspomniano, nie jest to coś, co masz robić:

Skrzyżowania mają być wykorzystane jako dopasowujących w kontekście logicznym; introspekcja złączy nie jest obsługiwana. Jeśli czujesz potrzebę introspekcji skrzyżowania, użyj zamiast tego zestawu lub podobnego typu.

  - docs.perl6.org/type/Junction

Jednak jest to możliwe.

Po pierwsze, można użyć authothreading (czyli automatyczna ocena każdej gałęzi skrzyżowania gdy przekazany do funkcji, która oczekuje argumentu typu Any):

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

drugie, może kłuć w jelitach i ręcznie wyodrębnić wartości:

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; 
} 

Jeśli węzeł jest nierekursywnych (czyli nie zawiera innych węzłów, które chcesz spłaszczyć), to ostatnie podejście można uprościć:

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

Jest to celowe, o ile wiem.

Wyobraź sobie, że j zawiera skrzyżowanie skrótów: wtedy wartości $ j byłyby połączeniem wartości Seq, , a nie samych skrótów.

Jeśli chcesz tablicę skrzyżowania, to może powinieneś zacząć od tablicy i budować skrzyżowania z że:

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

Jeśli naprawdę chcą iść skrzyżowaniu -> Array sposób, możesz, ale wymagałoby to użycia nqp, a to jest coś, czego nie polecałbym w kodzie użytkownika.

+0

Można to jeszcze bardziej uprościć: ' my $ j = dowolne moje @a = 1,2,3,4,5; ' – ab5tract