rust基础学习

1. rust静态宏#[macro_export]和#[macro_exportt(local_inner_macros)]区别

前者使得宏可以在任何地方使用,后者只能在当前模块及其子模块中使用。

2.字符串

在最基本的层面上,Rust 中的字符串表示为编码为 UTF-8 字节流的 Unicode 标量值序列。字符串是使用双引号创建的""。

let s = "Hello, World!";

原始字符串在Rust中,字符串字头前的r表示一个原始字符串。原始字符串忽略了所有的转义字符,并按原样打印字符串。当你想避免在字符串中转义反斜线时,这很有帮助,例如,在正则表达式或文件路径中。

let s = r"C:\Users\YourUser\Documents";

字节串Rust 也有字节字符串的概念。它们与文本字符串类似,但它们是由字节而不是字符构成的。您可以通过在字符串文字前添加"b"前缀来创建字节字符串:

let bs: &[u8; 4] = b"test"; // bs is a byte array: [116, 101, 115, 116]

Rust 中的字符串详解

3. match

官方约定:

 commas at the end of match arms are optional if:

  • it is the last match armor
  • if the right hand side of the arm is a block expression (stuff between two braces {}).

习惯做法:

  • If the right hand side ends with a closing brace }, omit the comma.
  • If not: use a comma, even when it's the last match arm.

Do Rust match statements require commas?

4. struct

除了类似于C、CPP的struct结构体类型外,还有元组结构类似于常规结构,但其字段没有名称。它们的使用方式与元组类似,但可以通过let TupleStruct(x, y) = foo;语法进行解构。对于访问单个变量,使用的语法与常规元组相同,即foo.0foo.1等,从零开始。如:struct Tuple(u32, String);

单元结构最常用作标记。它们的大小为零字节,但与空枚举不同,它们可以实例化,使它们与单元类型同构()。当你需要在某些东西上实现特征,但不需要在里面存储任何数据时,单元结构很有用。如:struct Unit;

5. Struct std::cell::Cell 和RefCell

CellRefCellRust提供的两种内部可变性的实现。Cell是用于Copy类型的,而RefCell是用于非Copy类型的。

Cell用于不可变对象具有内部可变性(interior mutability)

通过Cell,其封装了getset,可以在不需要显示声明为可变的情况下修改值。

use std::cell::Cell;

struct SomeStruct {
    regular_field: u8,
    special_field: Cell<u8>,
}

let my_struct = SomeStruct {
    regular_field: 0,
    special_field: Cell::new(1),
};

let new_value = 100;

// ERROR: `my_struct` is immutable
// my_struct.regular_field = new_value;

// WORKS: although `my_struct` is immutable, `special_field` is a `Cell`,
// which can always be mutated
my_struct.special_field.set(new_value);
assert_eq!(my_struct.special_field.get(), new_value);

6. ref与&区别

在Rust中,ref和&都用于引用(reference)的创建,但它们有一些异同之处。

语法:ref是模式匹配的一部分,通常用于将值绑定到一个新的变量上。例如,let ref x = value;会将value的引用绑定到x上。ref用于模式匹配中创建不可变引用;ref创建的引用的生命周期与绑定的变量的作用域相同。

而&是创建一个指向值的引用。例如,let x = &value;会创建一个指向value的不可变引用;作用域上,&创建的引用的生命周期可以是短于或长于引用所在作用域。

ref是用来创建引用的,它右边会有一个新创建的变量,这个变量就会是一个引用

&一共有两种意思

一个是在赋值号右面,用来给左边的变量赋值

一个是在match匹配模式下,用来进行解引用的
有一个很好记的方式,如果符号右边的变量是一个确定的值,那么就用&,如果符号右边的值是一个变量,这是新创建的值,之前没有出现过,那么就用ref

 

posted @ 2024-06-25 15:32  星辰大海浩瀚宇宙呀  阅读(29)  评论(0编辑  收藏  举报