Eu tenho uma definição de enum em um módulo AAA
:
enum RDProcDebug <None All AstBlock BlockType Scoping Templates MarkUp>;
class Debug {
method foo(RDProcDebug @ds) {
for @ds { say .key ~ ' => ' ~ .value }
}
}
Em programas Raku, isso funciona bem, por exemplo
use AAA;
my RDProcDebug $rp .= new;
$r.foo(AstBlock, BlockType);
Mas agora preciso fornecer os nomes dos elementos de depuração da linha de comando, que só pode fornecer Str, por exemplo
$ RDOpts='AstBlock BlockType' raku myprog
# and in myprog
if %*ENV<RDOpts>:exists {
$rp.debug( %*ENV<RDOpts> ); # this does not work
}
Então, como faço para converter uma lista de Str em uma lista do tipo enum RDProcDebug ?
Ok, então você deseja passar esses valores enum da linha de comando, mas aí você só obtém strings. Entendo. Aqui está o que você pode fazer:
Primeiro, pegue os RDOpts do seu ambiente e divida-os em palavras separadas.
Agora aqui está a parte interessante. Raku tem um truque para procurar valores enum pelo nome. Parece um pouco estranho, mas funciona assim:
O que isso faz é verificar em cada string da sua lista se há um valor enum correspondente. Se tudo correr bem, você terá uma lista de valores reais de RDProcDebug. Agora você pode simplesmente passá-lo para o seu método de depuração:
Todos juntos você obteria algo assim:
Ah, sim, mais uma coisa: se alguém digitar um nome errado, você receberá um erro. Você pode querer fazer algo sobre isso.