println!支持的格式化方式
第二天,先补充和总结一下println!
支持的格式化方式:
fn main() {
println!("{}", 1); // 基本方式,打印实现了Display trait的类型
println!("{:?}", "test"); // 打印实现了Debug trait的类型
println!("{:#?}", ("1. t1", "2. t2")); // 带换行和缩进的Debug打印
println!("0b{:b}", 0b11_01); // 二进制
println!("0o{:o}", 10); // 八进制
println!("0x{:x}", 0xFF); // 十六进制(小写)
println!("0x{:X}", 0xFF); // 十六进制(大写)
println!("{:p}", &100); // 打印引用或者指针所指对象的内存地址
println!("{:e}", 1000f32); // 1e3,科学计数(小写)
println!("{:E}", 1000f64); // 1E3,科学计数(大写)
// 使用参数索引
println!("{0} {1} {1}", "p", "q"); //p q q
// 使用命名参数
println!("{a} {b} {b}", a = "p", b = "q"); //p q q
}
接下来,有必要先认识一下Rust支持的基本数据类型。
其中整数(integer)相关的类型有:带符号(signed)的i8、i16、i32、i64、i128、isize
;相对应的无符号(unsigned)类型为u8、u16、u32、u64、u128、usize
。
其中isize和usize所占字节长度取决于CPU的位数(16/32/64)。数组和列表的下标就是usize类型。
还有32位浮点数f32
和64位浮点数f64
。
此外,还有占用1个字节的bool
类型和占4个字节的char
类型。
数值类型、std::mem::size_of()
fn main() {
let b: bool = true;
let i1:i8 = 1;
let i1:i16 = 1;//rust允许变量名被重新定义为新的类型
let i1:i32 = 1;
let i1:i64 = 1;
let i1:i128 = 1;
// u8类型本质就是1个字节
let i2:u8 = 0xFF;
let i2:u8 = b'A';//可以用b后跟字符进行初始化
let i2:u16 = 0xFF;//16进制
let i2:u32 = 0o77;//8进制
let i2:u64 = 0b1111_1111;//2进制
let i2:u128 = 100_000;//默认是10进制
//isize/usize占用的字节取决于处理器位数
//16位机器上,占2个字节(可能某些16位单片机要用rust吧)
//32位机器上,占4个字节
//64位机器上,占8个字节
let i1:isize = 1;
let i2:usize = 100;
// `i2 as i32`是把usize类型的i2转成i32类型
let end: i32 = i2 as i32 - 1;
// bool类型占用1个字节
println!("{}", std::mem::size_of::<bool>());//1
// i8类型占用1个字节
println!("{}", std::mem::size_of_val(&100i8));//1
//rust中char类型占用4个字节
let c:char = 'x';
println!("{}", std::mem::size_of_val(&c));//4
}
判断字符是数字还是字母
is_alphabetic()
,判断字符是否是A-Za-z
。
is_ascii_digit()
,判断字符是否是0-9
。
let c = 'x';
if c.is_alphabetic() {
println!("{} 是A-Za-z的字母", c);
} else if c.is_ascii_digit() {
println!("{} 是0-9的数字", c);
}
空类型(unit):()
()
类型代表“空”(类比其他语言中的null/nil
),占用0个字节。
let empty = ();
// 等号右边是一个语句(Statment)块,语句块的
// 最后一个表达式(Expression)的值就是该语句块的值
let i_1 = {1i32};//i32类型的1
let empty = {};//语句块的值为()
let empty = {;};//语句块的值为()
println!("empty is: {:?}", empty);//empty is: ()
println!("{}", std::mem::size_of_val(&empty));//0
元组tuple + 类型别名
//元组,tuple
let pp: (String, char, i32) = ("张三".to_string(), 'M', 20);
println!("{:?}", pp);
// 通过type关键字,给元组定义一个别名Person
// 当然,逻辑上更好的做法是定义为一个struct
type Person = (String, char, i32);
let p: Person = pp;
println!("name {}, gender: {}, age: {}", p.0, p.1, p.2);
assert!断言
此外,还需要说明的是,rust中的数值类型也有自己的方法可以调用。
//求得整数二进制形式中1的个数
assert_eq!(5i32.count_ones(), 2);
//浮点类型才可以sqrt()
assert_eq!(100f32.sqrt(),10f32);
assert_eq!(100.max(200), 200);
assert_eq!(100.cmp(&1000), std::cmp::Ordering::Less);
assert_eq!((-10i32).abs(), 10);
assert_eq!((-10i32).add(10), 0);
assert!(100.ge(&80));//true, ge是great equal的简写
assert!(100 >= 80);//true