搜索
您的当前位置:首页正文

模式|表达式匹配

来源:易榕旅网

if let表达式

if let Ok(age) = age这条语句引入了新的变量age来存储Ok变体中的值,而它覆盖了右侧的同名变量。

fn main() {
    let color: Option<&str> = None;
    let is_tuesday = false;
    let age: Result<u8, _> = "33".parse();

    if let Some(c) = color {
        println!("background clolr:{}", c);
    } else if let Ok(age) = age {
        if age > 30 {
            println!("age > 30")
        } else {
            println!("age <= 30");
        }
    } else if is_tuesday {
        println!("tuesday");
    } else {
        println!("default color")
    }
}

while let循环

while let会反复执行同一个模式匹配直到出现失败的情况。如果动态数组为空,则pop返回Nonewhile循环会在pop返回Some时迭代执行循环体中的代码,并在pop返回None时结束循环。

fn main() {
    let mut stack = Vec::new();
    stack.push(1);
    stack.push(2);
    stack.push(3);

    while let Some(top) = stack.pop() {
        println!("{}", top);
    }
}

for

enumerate作为迭代器的适配器,它会在每次迭代过程中生成一个包含值本身及值索引的元组。

fn main() {
    let mut stack = Vec::new();
    stack.push(1);
    stack.push(2);
    stack.push(3);

    for (index, value) in stack.iter().enumerate() {
        println!("{} is at index {}", value, index)
    }
}

可失败性

模式可以被分为不可失败(irrefutable)和可失败(refutable)两种类型。不可失败模式能够匹配任何传入的值。例如,语句let x = 5;

可失败模式可能因为某些特定的值而匹配失败。例如,表达式if let Some(x) = value中的Some(x)便是可失败模式。如果value的值是None而不是Some,那么表达式左侧的Some(x)模式就会发生不匹配的情况。

尝试使用let来处理可失败的模式、或者使用if let来处理不可失败的模式都会导致编译报错。match表达式的匹配分支中,除了最后一个,其他必须全部使用可失败模式,而最后的分支应该使用不可失败模式,因为它需要匹配值的所有剩余情形。

匹配命名变量

match第二个匹配分支引入了新的变量y,它会匹配Some变体中携带的任意值。因为我们处在match表达式创建的作用域中,所以这里的y是一个新的变量,而不是我们在程序起始处声明的那个变量y

fn main() {
    let x = Some(5);
    let y = 10;

    match x {
        Some(50) => println!("Got 50"),
        Some(y) => println!("Matched, y={:?}", y),
        _ => println!("Default case, x={:?}", x),
    }
}

多重模式

你可以在match表达式的分支匹配中使用|来标识or的意思,它可以被用来一次性地匹配多个模式。

fn main() {
    let x = 10;

    match x {
        10 | 12 => println!("hit"),
        _ => println!("something else"),
    }
}

@绑定

@运算符允许我们在测试一个值是否匹配模式的同时创建存储该值的变量,判断Message::Helloid字段是否在区间3..7中,使用的语法是3..=7

enum Message {
    Hello { id: i32 },
}

fn main() {
    let msg = Message::Hello { id: 5 };
    match msg {
        Message::Hello {
            id: id_variable @ 3..=7,
        } => {
            println!("Found id in range:{}", id_variable)
        }
        Message::Hello { id: 10..=12 } => {
            println!("Found id in another range")
        }
        Message::Hello { id } => {
            println!("Found some other:{}", id)
        }
    }
}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top