Rust 锈蚀模式是否与现有绑定匹配?

Rust 锈蚀模式是否与现有绑定匹配?,rust,Rust,我从昨天开始学习。下面的代码很简单-- 使用编码\u rs::编码; 使用std::fs; 使用std::fs::File; 使用std::io::BufReader; 使用std::io::Read; 使用std::option::option; 使用std::path::path; 外部板条箱编码; 外部板条箱编码; fn main(){ 让mut reader=BufReader::new(文件); 让多个物料清单:[u8;3]=[0;3]; //读取物料清单 如果让Ok(u)=读卡器读取

我从昨天开始学习。下面的代码很简单--

使用编码\u rs::编码;
使用std::fs;
使用std::fs::File;
使用std::io::BufReader;
使用std::io::Read;
使用std::option::option;
使用std::path::path;
外部板条箱编码;
外部板条箱编码;
fn main(){
让mut reader=BufReader::new(文件);
让多个物料清单:[u8;3]=[0;3];
//读取物料清单
如果让Ok(u)=读卡器读取准确(&uu物料清单){
//嗅探BOM表
//因为Rust不允许空值,所以我声明'Option'来存储编码结果。
让mut enc:Option=None;
匹配编码::用于物料清单(&bom){
一些((编码,)))=>{
//  {
if let Some(encoding)=encoding::for_标签(“UTF-8”。as_bytes()){
enc=一些(编码);
}
}
}
如果让一些(编码)=enc{
println!(“{:?}”,编码);
}
}
}
它打开一个文本文件,并尝试通过解析BOM(字节顺序标记)来分析其编码。如果
encoding::for_BOM
未返回编码,则代码将默认使用
UTF-8

我不喜欢
unwrap()
,因为它总是假设有一个有效的结果

我的问题是:有没有办法进行模式匹配并将结果直接放入现有的可变绑定中


e、 g.将
Some((encoding,))
更改为
Some((enc,))
,因此我不需要
enc=Some(encoding)的行

许多rust构造可以用作表达式,即它们可以返回值。因此,如果匹配的每个分支都返回相同类型的值,则可以直接将其分配到变量中。除非以后计划更改,否则它不必是可变的

让mut reader=BufReader::new(文件);
让多个物料清单:[u8;3]=[0;3];
如果让Ok(u)=读卡器读取准确(&uu物料清单){
让enc=匹配编码::for_bom(&bom){
Some((编码,))=>Some(编码),
None=>Encoding::for_标签(“UTF-8”。作为_字节()),
};
如果让一些(编码)=enc{
println!(“{:?}”,编码);
}
}
我将使用和的组合:

或(更清晰但稍长):


答案也很好。在这种情况下,组合符和手工编写的
匹配
的长度几乎相同,因此选择哪一个是一个品味问题。
let enc = Encoding::for_bom(&bom)
    .map(|t| t.0)
    .or_else(|| Encoding::for_label ("UTF-8".as_bytes()));
let enc = Encoding::for_bom(&bom)
    .map(|(e, _)| e)
    .or_else(|| Encoding::for_label ("UTF-8".as_bytes()));