基本类型
正如之前章节的介绍,通过编码技术,我们可以实现对数字、文字、符号、时间等数据进行编码以便在计算机中进行各种处理。
因此才有了整型、浮点型、字符串、数组、切片、哈希表、元组等基本类型,这些构成了编程语言的类型系统。
Rust基本类型。数字类型:i8、i16、i32、i64、i124、u8、u16、u32、u64、u128等
数据类型,即数个字节编码的十进制数字。而最为普遍的字符串string,则是一个可变长度的、符合UTF8编码规范的字节数组。
面向对象
类
“物以类聚,人以群分。”,面向对象通过抽象方法,提取同类事物的关键信息,形成类。
对象
按照GB/T 17969. 1(ISO/IEC 9834-1)的定义,对象是指“通信和信息处理世界中的任何事物,它是可标识(可以命名)的,同时它可被注册”。对象标识符(Object Identifier,OID)是与对象相关联的用来无歧义地标识对象的全局唯一的值,可保证对象在通信与信息处理中正确地定位和管理。通俗地讲,OID就是网络通信中对象的身份证。
ID
同一类型,拥有拥有数以亿计的对象,如何区分这些独一无二的个体呢?其实要做到这一点并不难,只要给这些个体一个全局唯一的“身份”即可。身份证号、手机号、IP地址、统一社会信用代码。
lazy_static! {
static ref IDENTIFIER_REGEX: Regex = Regex::new("^([0-9ABCDEFGY]{1})([1239]{1})([0-9ABCDEFGHJKLMNPQRTUWXY]{6})([0-9ABCDEFGHJKLMNPQRTUWXY]{9})([0-9ABCDEFGHJKLMNPQRTUWXY])$").unwrap();
static ref REGEX_18_ID_CARD_NO: Regex = Regex::new(r"^\d{17}[\dX]$").unwrap();
static ref ID_CARD_POWER: Vec<usize> = vec![7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
static ref WEIGHT: Vec<usize> = vec![1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
static ref VERIFY_CODE_MAP: HashMap<char,usize> = {
let verify_code = "0123456789ABCDEFGHJKLMNPQRTUWXY";
let verify_code_vec :Vec<char> = verify_code.chars().collect();
let mut verify_code_map = HashMap::new();
for (i,item) in verify_code_vec.iter().enumerate().take(verify_code.len()){
verify_code_map.insert(*item,i);
}
println!("{:?}",verify_code_map);
verify_code_map
};
// 公司名称需要排除的字符串,不包含中英文括号
static ref REGEX_NOT_COMPANY_NAME: Regex = Regex::new(r###"[`~!@#$%^&*+=|{}':;',\\.<>《》/?~!@#¥%……&*——+|\-{}\[\]【】‘;:"”“’。,、?]"###).unwrap();
// 金钱(千分位)
static ref MONEY_REGEX: Regex = Regex::new(r"^(-)?\d{1,3}(,\d{3})*(.\d+)?$").unwrap();
}
/// 18位身份证号校验
pub fn is_18_id_card(id_card_no: &str) -> bool {
if !REGEX_18_ID_CARD_NO.is_match(id_card_no) {
println!("{} isn't match regex", id_card_no);
return false;
}
let id_card_no_chars: Vec<char> = id_card_no.chars().collect();
let mut sum = 0;
for i in 0..17 {
let ch = id_card_no_chars[i] as usize - 48;
sum += ch * ID_CARD_POWER[i];
}
let check_code = match sum % 11 {
10 => '2',
9 => '3',
8 => '4',
7 => '5',
6 => '6',
5 => '7',
4 => '8',
3 => '9',
2 => 'X',
1 => '0',
0 => '1',
_ => 'N',
};
check_code == id_card_no_chars[17]
}
在一些场景(特别是数据库主键、网络请求序列号)为了快速获得全局唯一的ID,人们发明了
一切皆文件
// 将文件读取为字节数组
if let Ok(cipher_data) = std::fs::read("why-rust.crypto") {
let plaintext = cipher
.decrypt(nonce, cipher_data.as_ref())
.expect("decryption failure!");
println!("{}", String::from_utf8(plaintext).unwrap());
}
/// 逐行读取文件
#[test]
fn read_file_lines() {
match File::open("why-rust.txt") {
Ok(f) => {
let reader = BufReader::new(f);
let lines = reader.lines();
for line in lines.map(|x| x.unwrap()) {
println!("{}", line);
}
}
Err(e) => panic!("can't open this file :{}", e),
}
}
///将文件读取为一个字符串
match std::fs::read_to_string("provinces.json") {
Ok(data) => {
println!("open provinces.json...");
let v: Vec<AdministrativeDivisions> = serde_json::from_str(&data).unwrap();
for ad in v {
println!("{:?}={:?}", ad.code, ad.name);
}
}
Err(e) => panic!("can't open this file : {}", e),
}
// 将字节数组写入文件
let mut all_bytes = Vec::<u8>::with_capacity(128);
all_bytes.extend_from_slice(&key);
all_bytes.extend_from_slice(&iv);
all_bytes.extend_from_slice(&encrypt_bytes);
std::fs::write("poem.crypto", &all_bytes);
文件格式
为了方便计算机识别、处理、存储各类不同的数据文件,采用不同的编码方式(即文件格式)编码特定的数据。不论是简单的txt,xml,json等格式的数据还是复杂的doc,xls,pdf、[OFD]等格式。
办公三件套:Word,Excel,PPT
微软的Office办公三件套:Word,Excel,PowerPoint成为办公领域的标准,每年为微软创造上百亿美元的收入。
国内金山办公经过三十多年的追赶,其产品WPS终于在办公软件拥有一席之地、站稳了脚跟。
Excel
calamine Rust实现的Excel工具,目前只支持读操作(不支持写操作)。
use calamine::DataType::{
Bool, DateTime, DateTimeIso, Duration, DurationIso, Empty, Error, Float, String,
};
use calamine::{
open_workbook, open_workbook_auto, Ods, Reader, Sheet, SheetType, SheetVisible, Xls, Xlsb, Xlsx,
};
use calamine::{CellErrorType::*, DataType};
#[test]
fn any_sheets_xlsx() {
let path = format!(
"{}/examples/file/any_sheets.xlsx",
env!("CARGO_MANIFEST_DIR")
);
println!("{}", &path);
let mut workbook: Xlsx<_> = open_workbook(path).unwrap();
let range = workbook.worksheet_range("Visible").unwrap();
let total_cells = range.get_size().0 * range.get_size().1;
let non_empty_cells: usize = range.used_cells().count();
println!(
"Found {} cells in 'Sheet1', including {} non empty cells",
total_cells, non_empty_cells
);
// alternatively, we can manually filter rows
assert_eq!(
non_empty_cells,
range
.rows()
.flat_map(|r| r.iter().filter(|&c| c != &DataType::Empty))
.count()
);
}
PDF(Portable Document Format) 可携带文件格式
OFD 版式文档国家标准