我从昨天开始学习Rust。以下代码很简单-
use encoding_rs::Encoding;
use std::fs;
use std::fs::File;
use std::io::BufReader;
use std::io::Read;
use std::option::Option;
use std::path::Path;
extern crate encoding_rs;
extern crate encoding_rs_io;
fn main() {
let mut reader = BufReader::new(file);
let mut bom: [u8; 3] = [0; 3];
// read BOM
if let Ok(_) = reader.read_exact(&mut bom) {
// sniff BOM
// Because Rust disallows NULLs, hence I declare `Option<&Encoding>` to store the result of encoding.
let mut enc: Option<&Encoding> = None;
match Encoding::for_bom(&bom) {
Some((encoding, _)) => {
// <-- Some((enc, _))
enc = Some(encoding);
}
None => {
if let Some(encoding) = Encoding::for_label("UTF-8".as_bytes()) {
enc = Some(encoding);
}
}
}
if let Some(encoding) = enc {
println!("{:?}", encoding);
}
}
}
Run Code Online (Sandbox Code Playgroud)
它打开一个文本文件,并尝试通过分析BOM(字节顺序标记)来分析其编码。如果Encoding::for_bom未返回编码,则该代码将UTF-8用作默认值。
我不喜欢,unwrap()因为它总是假设有一个有效的结果
我的问题是:有没有办法进行模式匹配并将结果直接放入现有的可变绑定中?
例如更改Some((encoding, _))为,Some((enc, _))因此我不需要enc = Some(encoding)
许多rust构造都可以用作表达式,即它们可以返回值。因此,如果匹配的每个分支都返回相同类型的值,则可以将其直接分配给变量。除非您计划以后进行更改,否则它不必是可变的。
let mut reader = BufReader::new(file);
let mut bom: [u8; 3] = [0; 3];
if let Ok(_) = reader.read_exact(&mut bom) {
let enc = match Encoding::for_bom(&bom) {
Some((encoding, _)) => Some(encoding),
None => Encoding::for_label("UTF-8".as_bytes()),
};
if let Some(encoding) = enc {
println!("{:?}", encoding);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
56 次 |
| 最近记录: |