#[derive(Display,Debug)]struct Something { var: u8}println!("{:?}", Something { var: 1 });
作用域
Trait有作用域,而且与它实现的类型的作用域是独立的 。也就是说,你可以使用一个类型 , 但无法使用一个trait的实现(例如,如果这个实现来自另外一个库,而不是来自该类型本身) 。你可以use这个实现 。
self
trait中的self指向它实现的类型 。&self是指向 self: &Self 的别名,其中Self表示该类型(上例中的 self: &Dog) 。self也是self: Self的别名 , 但两者的区别就是后者会移动变量(即消耗该变量,该变量就无法从外部访问了) 。
当函数定义不以self、&self或&mut self开始时(&mut self相当于带有可改变引用的 &self),就是一个静态方法 。Trait依然可以像任何方法一样定义并实现静态方法 。常见的一个静态方法是new,用于创建类型或结构的实例:
impl Something { fn new -> Something { Something { x: 1 } }}...let var = Something::new;

文章插图
指针
指针实际上非常易懂,尽管它来自其他更高级的语言 。我经常会用错 。
&A指向A,使用时只需要确保A存在 , 即可保证&A存在,因为我们不应该让指针指向不存在的对象 。
Rust会在编译时进行静态检查,确保不会出现上述情况 。它会自动释放超出作用域的变量,并且不允许指针的存活超过变量 。另一个安全保证是 , 只能有一个可改变的指针 。
也就是说下述代码是错误的:
let a = 1;let b = &a;let c = &mut a;println!("{b}"); // Error! there can only be one mutable pointerc = 1;我们只需要保证原始变量在指针的作用域中一直存在即可 。
在结构中使用指针会有点问题,因为编译器不喜欢这种做法(因为结构的寿命通常比原始变量更长) 。我通常会采用所有权转移或克?。?clone() , Clone trait的一部分,可以被derived) 。
有时候,一些函数要求只能用指针,不能用所有权转移 。这时,只需在值的前面加上 & (或 &mut)即可 。
something(&a);此外,还有双重、三重等指针,但很少见,而且一般来说只会更难处理 。
你也不需要考虑释放变量的问题,Rust会在超出作用域时自动释放 。

文章插图
命名空间
使用全名就无需导入 。导入只不过是别名 。
std::env::argsuse std::env;env::argsuse std::env::args;args选择多个“命名空间”可以使用{},如:
use std::env::{args, var};也可以重复使用use:
use std::env;use std::env::args;env::var;args还有一点 , 你也可以在函数内使用use 。这样,如果代码没有被执行 , 库就不会被导入(即,如果函数没有在代码路径中出现,例如,use了一个测试用的库,而use只写在了测试用例中,那么在正常构建时就不会导入该库) 。
fn test { use std::env; env::var;}但我不推荐在正常的代码路径中这样写,应该使用全局的导入 。

文章插图
可见性
相关经验推荐
- 放弃简约风吧!过年回家这样打扮,时髦贵气,美得好高级
- 大地色真是秋天yyds,宋轶一身大地色高级又甜美,不止显白还显瘦
- 怎么从成品尺寸推算坯布幅宽
- 秦始皇如何从吕不韦手中夺权
- 为什么建议男生多穿阔腿裤?看这几位明星就知道了,显瘦、高级、太时尚,还提气质!
- 女生微信网名高级冷酷 微信网名高冷霸气冷酷女
- 自然人从什么时起享有民事权利
- 盘点微胖女生的显瘦穿搭,掌握2个搭配要点,造型高级又有范
- 丈夫酒驾接妻子下班被抓:明天能从电视上看到我吗?
- 春天一句话 春天一句话精选
