码迷,mamicode.com
首页 > 其他好文 > 详细

Rust中文翻译34

时间:2015-08-17 19:41:46      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:rust   编程语言   

5.14 Match
经常,一个简单的if/else还不够,因为你可能会有多于两种情况.而且,条件会变得更加复杂.Rust有一个关键字,match,允许你替代复杂的if/else组合,来实现一些更强大的功能.看一下:

let x = 5;
match x {
     1 => println!("one"),
     2 => println!("two"),
     3 => println!("three"),
     4 => println!("four"),
     5 => println!("five"),
     _ => println!("something else"),
}

match需要一个表达式然后基于它的值会有很多分支.每一个分支都是一个 val => expression的格式.当值匹配的时候,那个分支的值就会被计算.它被称为match是因为模式匹配,match是实现匹配的方式.一个完整的段落覆盖了所有可能的模式.

那么优点是什么呢?有很多.首先,match强调完全的检查.你看到最后一个分支了么,下划线开头的那个?如果我们删除这个分支,Rust会报错:

error: non-exhaustive patterns: ‘_‘ not covered

也就是说,Rust正在告诉我们忘记了一个值.因为x是一个整数,Rust知道它可以包含不同的数值,例如,6.没有下划线的话,就没有任何分支可以匹配,Rust就拒绝编译.下划线就像匹配所有分支一样.如果没有任何其他分支匹配的话,那么下划线分支就会匹配,我们有了这个分支,就可以处理所有可能的值.我们的程序就可以编译正常了.

match同时也是一个表达式,我们可以在等号右边使用它.

let x = 5;
let number = match x {
     1 => "one",
     2 => "two",
     3 => "three",
     4 => "four",
     5 => "five",
     _ => "something else",
};

有时,这是转换值的好方法.

5.14.1 匹配一个枚举

另一个重要的应用就是处理一个枚举的可能值:

enum Message {
     Quit,
     ChangeColor(i32, i32, i32),
     Move { x: i32, y: i32 },
     Write(String),
}

fn quit() { /* ... */ }
fn change_color(r: i32, g: i32, b: i32) { /* ... */ }
fn move_cursor(x: i32, y: i32) { /* ... */ }

fn process_message(msg: Message) {
     match msg {5.15. PATTERNS 169
          Message::Quit => quit(),
          Message::ChangeColor(r, g, b) => change_color(r, g, b),
          Message::Move { x: x, y: y } => move_cursor(x, y),
          Message::Write(s) => println!("{}", s),
     };
}

Rust编译器会进行完全检查,所以它会要求你使用枚举的每一个可能的值.如果你漏掉了一个,就会有编译错误,除非你使用下划线分支.

和之前的match不同的是,你不能使用一个普通的if语句来做这件事.你可以试用if let语句,来做为match的简化版本.

Rust中文翻译34

标签:rust   编程语言   

原文地址:http://blog.csdn.net/zcmit/article/details/47728033

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!