如何在match语句中使用实例化结构值?

时间:2018-11-23 00:05:56

标签: syntax rust

我有一个示例实例结构,名为args,它是原始结构Args。

import pandas as pd
df = pd.ExcelFile(xl_path).parse(sheet_name).append(iterable, ignore_index=True)

,实例结构为:

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

使用这些参数,我试图避免混乱的if-else语句,而仅使用let args = Args { arg1: true, arg2: false, } 语句。但是,当尝试执行以下操作时:

match

我得到了错误

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

是否应该使用转义字符序列来避免这种情况,或者这仅仅是语法错误?

1 个答案:

答案 0 :(得分:3)

对于我来说,对于同时将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!")
    }
}