Corso di Raku / Avanzato / Contenitori / Contenitori ordinati

Appiattimento e itemizzazione

Quando metti un array dentro un altro, Raku non unisce automaticamente i loro elementi. Esamina il seguente programma:

my @a = 1, 2, 3;
my @b = 4, 5;
my @c = @a, @b;

say @c.elems; # 2
say @c;       # [[1 2 3] [4 5]]

L’array @c ha solo due elementi: gli array @a e @b. Raku mantiene ogni contenitore come un singolo elemento piuttosto che riversarne il contenuto nell’array esterno. Lo stesso accade per un valore posto tra altri:

my @a = 1, 2, 3;
my @d = 0, @a, 99;
say @d; # [0 [1 2 3] 99]

Quando vuoi effettivamente una singola sequenza piatta, richiedila esplicitamente con la routine flat:

my @a = 1, 2, 3;
my @b = 4, 5;

say flat(@a, @b);       # (1 2 3 4 5)
say flat(@a, @b).elems; # 5

Itemizzazione (Itemization)

A volte vuoi l’opposto: proteggere un contenitore dall’essere appiattito, anche dentro flat. Il costrutto $(...) itemizza il suo argomento — contrassegna il risultato come un singolo elemento. Confronta l’esempio precedente con questo:

my @a = 1, 2, 3;
my @b = 4, 5;

say flat($(@a), @b); # ([1 2 3] 4 5)

Qui, $(@a) mantiene @a come un unico elemento, mentre @b viene comunque appiattito nei suoi due valori. Questa è ancora l’idea del sigillo $: un $ significa “tratta questo come una singola cosa”.

Pratica

Risolvi 1 quiz sul contenuto di questo argomento.

Binding con :=   |   Quiz — Annidare array


💪 Oppure vai direttamente agli esercizi di questa sezione.