Как использовать экземпляры структурных значений в выражении соответствия? - PullRequest
0 голосов
/ 23 ноября 2018

У меня есть пример экземпляра структуры с именем args, исходной структуры Args.

struct Args {
    arg1: bool,
    arg2: bool,
}

, а экземпляр структуры:

let args = Args {
    arg1: true,
    arg2: false,
}

Используя эти аргументы, я пытаюсьчтобы избежать путаницы операторов if-else и просто использовать оператор match.Однако при попытке выполнить следующее:

match true {
    args.arg1 => println!("Argument 1 is true!"),
    args.arg2 => println!("Argument 2 is true!"),
}

Мне выдается ошибка

error: expected one of `=>`, `@`, `if`, or `|`, found `.`
  --> src/main.rs:13:13
   |
13 |         args.arg1 => println!("Argument one is true"),
   |             ^ expected one of `=>`, `@`, `if`, or `|` here

error: aborting due to previous error

Есть ли последовательность символов перехода, которую я должен использовать, чтобы избежать этого, или это просто неправильносинтаксис

1 Ответ

0 голосов
/ 23 ноября 2018

Мне непонятно, что вы имеете в виду для случая, когда arg1 и arg2 установлены на true - хотите ли вы, чтобы первая ветвь if была взята, или обе?

Если оба - то на самом деле вы должны просто использовать несколько ifs.

if args.arg1 { println!("Argument 1 is true!") }
if args.arg2 { println!("Argument 2 is true!") }

Если должен встречаться только один, предпочитая arg1, тогда вы можете использовать struct destructure

match args {
    Args { arg1:true, ..} => println!("Argument 1 is true!"),
    Args { arg2:true, ..} => println!("Argument 2 is true!"),
    _ => println!("Neither is true")
}

Вы можете использовать совпадение и для сопоставления с более сложными случаями

match args {
   Args {arg1:true, arg2:false, ...} => println!("TF"),
}

Однако, если не более одного аргумента может быть истинным одновременно, у вас действительно есть перечисление, и вы, вероятно, должны обработатьэто как

enum Arg {
  None,
  Arg1,
  Arg2
}

fn main() {
    let args:Args = get_argument();
    match args {
       Args::None => println!("none"),
       Args::Arg1 => println!("Argument 1 is true!"),
       Args::Arg2 => println!("Argument 2 is true!")
    }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...