Estou tentando aprender Rust e tentando escrever um programa simples que receba argumentos da linha de comando para me acostumar com alguns conceitos básicos. O código que escrevi para lidar com os argumentos falha e sinto que estou perdendo algum conceito básico.
fn process_args(args: Vec<String>) {
let my_string: String = String::from("--verbose");
for item in &args[1..] {
match item{
my_string=>do_something_with_argument(),
_=>println!("unexpected argument {item}"),
}
}
}
Onde vscode me diz que a variável 'my_string' não é utilizada. Também experimentei esta versão:
fn process_args(args: Vec<String>) {
for item in &args[1..] {
match item{
"--verbose"=>do_something_with_argument(),
_=>println!("unexpected argument {item}"),
}
}
}
que falha porque a string literal não pode ser correspondida com uma string, então tentei:
fn process_args(args: Vec<String>) {
for item in &args[1..] {
match item{
String::from("--verbose")=>do_something_with_argument(),
_=>println!("unexpected argument {item}"),
}
}
}
O que também não funciona.
O que estou perdendo. Eu sinto que todos eles deveriam funcionar.
O lado esquerdo de um braço "fósforo" é um padrão . Se você tiver um nome em um padrão, é uma declaração implícita. Portanto, na primeira versão, o primeiro braço é apenas um padrão para qualquer valor, vinculando-o à (nova) variável local
my_string
. Algumas linguagens (por exemplo, erlang) podem desreferenciar variáveis em padrões, Rust não.A terceira versão não pode funcionar porque uma chamada de função não é um padrão válido.
A segunda versão quase funciona se você se preocupar em ler o erro do compilador:
item
é um&String
, mas o padrão corresponde apenas a&str
, então tudo que você precisa fazer é fazer com que os dois correspondam "convertendo"item
para um&str
, viaString::as_str
ou&**
por exemplo:Embora eu também diria que isso não é muito útil, você está testando sinalizadores para igualdade, por que não apenas... testa sinalizadores para igualdade? Usando
==
? Não é como se Rust pudesse construir uma tabela de salto a partir de strings.