2017-11-19 88 views
5

Czy istnieje metoda idiomatyczna lub wbudowana metoda na concatenate dwóch Sets ciągów?Jak połączyć dwa zestawy ciągów w Perl 6?

Oto, czego chcę:

> my Set $left = <start_ begin_>.Set 
set(begin_ start_) 
> my Set $right = <end finish>.Set 
set(end finish) 
> my Set $left_right = ($left.keys X~ $right.keys).Set 
set(begin_end begin_finish start_end start_finish) 

Lub, jeśli istnieje więcej niż dwa z nich:

> my Set $middle = <center_ base_>.Set 
> my Set $all = ([X~] $left.keys, $middle.keys, $right.keys).Set 
set(begin_base_end begin_base_finish begin_center_end begin_center_finish start_base_end start_base_finish start_center_end start_center_finish) 
+0

Dlaczego dodamy funkcję, która jest używana tylko w tej jednej sytuacji? Zwłaszcza, że ​​nie uczyniłoby to kodu bardziej przejrzystym. Jednym z celów projektu jest zmniejszenie liczby specjalnych przypadków. Myślę, że najlepszą rzeczą, na jaką możesz liczyć, jest posiadanie "X" zachowującego się specjalnie, jeśli otrzymasz dwa zestawy, aby można było usunąć ".keys". –

+0

W moim rozwiązaniu nie lubię używać '.keys', konwertując w ten sposób' Set' na 'Seq', a następnie łącząc, a następnie wracając do' Set'. Może się mylę oczywiście, a teraz jestem absolutnie zadowolony z tego, jak to robię. :) –

Odpowiedz

9

Można użyć funkcji reduce jechać z dowolnej liczby zestawów do A pojedynczy zestaw ze wszystkimi połączonymi w nim elementami:

my Set @sets = set(<start_ begin_>), 
       set(<center_ base_>), 
       set(<end finish>); 
my $result = @sets.reduce({ set $^a.keys X~ $^b.keys }); 
say $result.perl 
# => 
Set.new("start_base_end","begin_center_finish","start_center_finish", 
     "start_center_end","start_base_finish","begin_base_end", 
     "begin_center_end","begin_base_finish") 

To wydaje mi się czyste.

+1

Ta odpowiedź na Xop zainspirowała mnie do napisania nowego przykładu na temat tego repozytorium: https://github.com/dataf3l/perl6-examples/blob/master/p65.p6 Mam nadzieję, że pomoże to każdemu, kto czyta o perl6 i nauce, być może te przykłady są podstawowe, ale kto wie, może ktoś je uzna za przydatne :) –

+0

Więc, co próbuję powiedzieć, to dziękuję za wkład! –