Rust Trait

Rust中的特征Trait类似于其他语言中的接口,它定义了一组可以被共享的行为,只要实现了特征,就能使用这组行为。 特征 Trait 特征的定义 通过trait关键字对特征进行定义。 pub trait Student { fn GoClass(&self); fn LeaveClass(&self); fn getClassRoom(&self) -> String; } 上述声明了**身为学生应该有的几个特征行为:**即上课,下课和获取教室房间号,那么其他具有学生性质的结构体(或者说为类)需要遵循该特征。 需要注意:特征只是坐函数签名,并不是真正的实现函数,函数的实现在绑定了该特征的类里实现,下面一节会提到。 类型实现特征 使用for关键字来为类实现特征。 pub struct Bob { pub year: String, pub sex: String } impl Student for Bob { // 实现特征 fn GoClass(&self){ // .... } fn LeaveClass(&self) { // ... } fn getClassRoom(&self) { // ... } } 在Bob类型中实现了Student特征声明的三个函数,这是必须的,除非在特征中有默认的实现。 如果特征中有默认的函数实现,那么绑定的类型可以不用再次实现函数,若实现了对应的函数,那么会覆盖默认的特征函数实现。如下所示。 pub trait Student { fn GoClass(&self){ println!("this is student!"); } fn LeaveClass(&self); fn getClassRoom(&self) -> String; } impl Student for Bob { fn GoClass(&self){ println!...

July 17, 2023 · 2 min · 282 words · Runtus
cover

Rust-所有权

所有权系统和引用在Rust中是至关重要的,它的设计使得rust的GC机制与众不同,也让rust获得了性能上的回报。 所有权 所有权:一个数值只能被一个变量所拥有,即该变量唯一拥有该数值,若变量离开了其作用域,数值也会被释放掉。 如果将一个变量赋值给另一个变量,则意味着对应的值的所有权会被移交出去,那么原先的变量将不再拥有值的所有权,这也是为什么在rust中,变量的赋值也叫变量的绑定。 // 例子 fn main(){ let s1 = String::from("Hello"); let s2 = s1; // 所有权移交 -> 即move println!("{}", s1); // 报错 } 可以看到,上述例子的s1将所有权移交给s2后,自己便不再拥有对字符串Hello的控制。 从内存的视角观察 还是上述例子,在内存里表示出来,如下图所示。 可以看出,再进行变量绑定时,s2实际上是s1的浅拷贝结果,但唯一不同的是指针的移交操作,即指针不是单纯的拷贝,而是从s1上“移交”给了s2,这也是一个move的过程。 如果不想让s1的所有权移交出去,则可以调用String的clone方法来实现深拷贝 ,在堆内存上再开辟一个空间,这样两个变量都有对应的值,这样就不会发生变量无法使用的情况了。 let s1 = String::from("hello"); let s2 = s1.clone(); // 直接重新开辟一个空间,尽量少用,会影响rust性能 println!("s1 = {}, s2 = {}", s1, s2); 需要注意的是,这并不能说明存储在堆内存中的数据只能有一个引用(即指针),这里只强调了move这个操作,即所有权的移交过程,而没有说明堆数据只能有一个引用。 Copy类型 之所以提到copy类型是因为它与上述的String类型有所不同,具有Copy属性的数据类型的数据都是直接存储于栈内存中的,即具有copy特征的数据在进行赋值时,旧变量依然可以使用。 fn main(){ let a = 1; let b = a; // 将 a 赋值给 b } 当赋值时,进行了浅拷贝操作,由于简单类型直接在栈上进行浅拷贝,开销小,两个1时存储在不同的栈内存空间里,所以两个变量都有与之对应的数值,所以不会像刚才的String类型一样,发生s1不可使用的情况。...

October 26, 2022 · 1 min · 82 words · Runtus