rust学习 (4)

字符转数字

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 = 你好
*/

遍历字符串

  1. 以字符形式
  2. 以字节形式
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!();
}

猜你喜欢

转载自blog.csdn.net/qq_40642465/article/details/119901510