Jeśli przypiszesz nieokreślonej wartości do tablicy, to będzie zawierać tę wartość niezdefiniowana, co komplikuje za pomocą pętli, jeśli nie chcesz iteracyjne nad wartości niezdefiniowanych:Jak mogę idiomatycznie ignorować niezdefiniowane elementy tablicy (lub w ogóle unikać przypisywania ich do tablicy)?
my @bar = 1, 2, Any;
for @bar -> $baz {
put $baz;
}
To daje następujące dane wyjściowe, w tym ostrzeżenie dla wartości niezdefiniowanych:
1 2 Use of uninitialized value $baz of type Any in string context. Methods .^name, .perl, .gist, or .say can be used to stringify it to something meaningful. in block at for.p6 line 4
wiem, że mogę sobie z tym wyraźnie w wielu sposób, na przykład:
for @bar -> $baz {
next unless $baz; # Skip this iteration
put $baz;
}
for @bar.grep: *.defined { # Just iterate over the defined values
put $baz;
}
# Reassign @bar to only contain defined values
@bar.=grep(*.defined);
for @bar -> $baz {
put $baz;
}
Ale czy nie istnieje bardziej idiomatyczny sposób na uniknięcie otrzymania niezdefiniowanych wartości przez @foo
lub uniknięcie iteracji po niezdefiniowanych wartościach?
na razie, gdy przypisanie do tablicy, mam zamiar używać poniższego defined-flat
funkcję, aby uniknąć takich sytuacji:
multi defined-flat (@array) {
return @array.grep(*.defined).flat;
}
# Return single defined element (or empty list for single undefined value)
multi defined-flat ($element) {
return $element //();
}
"lub unikaj przypisywania ich do tablicy" - To naprawdę zależy od tego, jak budujesz tablicę.Najbardziej idiomatycznym rozwiązaniem byłoby prawdopodobnie wygenerowanie danych wejściowych dla tablicy w taki sposób, aby zawierały tylko zamierzone elementy i nie niezainicjowane "martwe" elementy. – smls