Я изучаю 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);
}
}
}
Он открывает текстовый файл и пытается проанализировать его кодировку, анализируя BOM (Byte Order Marker).Если Encoding::for_bom
не возвращает кодировку, код будет использовать UTF-8
по умолчанию.
Мне не нравится unwrap()
, потому что он всегда предполагает, что есть верный результат
Мой вопрос: есть ли способ сопоставления с образцом и помещения результата непосредственно в существующую изменяемую привязку?
например, Изменить Some((encoding, _))
на Some((enc, _))
, следовательно, мне не нужна строка enc = Some(encoding)