字符转数字
fn main() {
let a = "Aa";
for c in a.chars() {
println!("{}", c as u32 );
}
}
//output
//65
//97
打印变量内存地址
fn main() {
let a=544;
println!("a地址 = {:p}", &a);
}
//output
//a地址 = 0x7ffe961d154c
测类型占字节大小
fn main() {
println!("char size = {}",std::mem::size_of::<char>());
}
//output
//char size = 4
size_of::<T>()
传入T,返回T类型大小(usize类型),也可以测结构体,枚举,联合体大小。b’A’表示字符’A’只占一个字节内存,是字节字面值类型。String的len方法可以看到String占内存大小(单位是字节)。
字符编码
unicode 统一码包含了世界所有字符的编码,在unicode的基础上有多种实现方式如UTF-8, UTF-16, UTF-32。其中UTF-8 最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度,如’A’的编码是一个字节,'严’的编码是3个字节,英文字符和数字这些单字节就能表示的符号,其UTF-8编码和ASCII码是一致的。参考文章
- &String可以强转变成&str
使用字符串silce取某一段
fn main() {
let s = "你好鸭";
//let ch = s[0]; ex1:字符串slice,无法用索引访问单个字符
let ss = &s[0..6];
println!("s = {} ", s);
println!("ss = {} ", ss);
let s = "你好鸭".to_string();
//let ch = s[0]; ex1:String,无法用索引访问单个字符
let ss = &s[0..6];
println!("s = {} ", s);
println!("ss = {} ", ss);
}
/*
output
s = 你好鸭
ss = 你好
s = 你好鸭
ss = 你好
*/
遍历字符串
- 以字符形式
- 以字节形式
fn main() {
let s = "你好鸭".to_string();
for c in s.chars() {
println!("c = {}", c);
}
for b in s.bytes() {
println!("b = {}", b);
}
}
/*
output
c = 你
c = 好
c = 鸭
b = 228
b = 189
b = 160
b = 229
b = 165
b = 189
b = 233
b = 184
b = 173
*/
字符串 slice=&str:它们是一些储存在别处的 UTF-8 编码字符串数据的引用,另外字符串字面值也等于&str类型。经查阅资料以及询问,字符串slice类型也是str类型。silce内部有一个指向第一个元素的指针和长度。
#![feature(type_name_of_val)] //要切换到nightly版本才能用,可以在本地切换rustc版本,也可以在playground用
fn main() {
let s1=String::from("hello rust!");
let ss=&s1[..];
let s2= "hello!";
let num = 324u32;
println!("{} : {} ",std::any::type_name_of_val(&ss),ss); //传入要测的变量的引用
println!("{} : {} ",std::any::type_name_of_val(&s2),s2);
println!("{} : {} ",std::any::type_name_of_val(&num),num);
}
/*
output
&str : hello rust!
&str : hello!
u32 : 324
*/
- 代码片选中后按tab右移,按shift+tab左移
- 变量使用之前要初始化
- json是键值对组成的数据对象类似于结构体变量那样
- json对象转结构体
结构体赋默认值
#[derive(Debug, Default)]
struct Stu {
id: i32,
name: String,
}
fn main() {
let i: i8 = Default::default();
let (x, y): (Option<String>, f64) = Default::default();
let s: String = Default::default();
let stu1: Stu = Default::default(); //自定义的结构体使用Default::default()函数初始
//化,要先在Stu定义上面添加Default属性.
println!("{}", i);
println!("{:?},{:?}", x, y);
println!("s={}", s);
println!("stu1={:#?}", stu1);
}
自定义宏
macro_rules! say_hello_world{ //say_hello_world宏
() => {
println!("hello world");
};
}
fn main(){
say_hello_world!();
}
#[macro_use] 使用方法
// /src/my_macro.rs 对main函数来说这个文件就是一个模块
macro_rules! say_hello {
() => {
println!("hello !");
};
}
// /src/other_my_macro.rs
macro_rules! say_hello_world{
() => {
println!("hello world");
};
}
// /src/main.rs
#[macro_use] //这个语句的意思是把下面的模块中定义的宏加到当前/src/main.rs作用域,添加say_hello宏
pub mod my_macro; //my_macro是定义了say_hello宏的模块,模块名字就是rs文件名字
#[macro_use] 添加say_hello_world宏
pub mod other_my_macro;
fn main(){
say_hello_world!();
say_hello!();
}