合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
[TOC] ### 一个简单的例子体会Rust的租借 ### C、C++变量操作 写过C或者C++的朋友应该知道,在C语言中如果我们引用一个地址,然后操作指针是能修改这个地址里的值的: ```C++ #include <iostream> int main() { int a = 10; int *p = &a; *p += 1; //std::cout << "a: " << (void*)&a << std::endl; std::cout << "a:" << a << std::endl; } ``` ![](https://img.kancloud.cn/d0/30/d030a4eded20b7167f8272bff6e74a70_602x110.png) ### Rust里的变量操作 但是如果我们使用Rust来进行同样的操作: ```rust fn main() { let x: i32 = 10; let y = &x; *y += 1; println!("{:?},{}", x, y); } ``` 程序build的时候就会报错 ![](https://img.kancloud.cn/a8/ba/a8ba4edee6e67e0530266472ac2d62b7_1109x317.png) **Y '是一个' & '引用,因此它所引用的数据不能被写入** 接下来这段代码更有意思:如果我操作指向x这个变量的指针无法操作里面的值,我直接x++呢: ```rust fn main() { let x: i32 = 10; let y = &x; // *y += 1; 提示:`y` is a `&` reference, so the data it refers to cannot be written x+=1; println!("{:?},{}", x, y); } ``` 有意思的来了,运行之后依旧报错: ![](https://img.kancloud.cn/26/db/26dba32bedb32deecca57754aae5ce32_1173x300.png) cannot assign twice to immutable variable **不能给不可变的变量赋值两次** 所以,在Rust中声明的变量是不能被修改的,想要修改就需要加上关键字**mut** ```rust fn main() { let mut x: i32 = 10; //let y = &x; let y = 11; // *y += 1; 提示:`y` is a `&` reference, so the data it refers to cannot be written x += 1; println!("{:?},{}", x, y); } ``` 运行效果如下: ![](https://img.kancloud.cn/e7/ab/e7ab2bcb9cc821cad7167a6ff835a3e7_980x246.png) 所以在Rust中`mut`修饰的变量具有可变性。 接下来继续看一个好玩的东西: 在C++中通过指针操作变量的同时,变量本身执行++: ```c++ #include <iostream> int main() { int a = 10; int *p = &a; a += 1; *p += 1; //std::cout << "a: " << (void*)&a << std::endl; std::cout << "a:" << a << std::endl; } ``` 运行效果如下: ![](https://img.kancloud.cn/0d/f1/0df1698cd62762a54db13323aad686d7_624x138.png) 可以看到是没问题的,但是在Rust中进行同样的操作呢? ```rust fn main() { let mut x: i32 = 10; let y = &x; x += 1; *y += 1; println!("{:?},{}", x, y); } ``` 运行效果如下: ![](https://img.kancloud.cn/b4/f5/b4f5c57beff07427e25986794b57d141_948x308.png) 报错了:**对借来的' x '赋值在这里** 所以这里是和C++不同的,x已经被租借出去了,就不能再修改他的值了。 如果x被定义为不可以修改,并且引用呢? ```rust fn main() { let x: i32 = 10; let y = &x; println!("{:?},{}", x, y); } ``` ![](https://img.kancloud.cn/92/9a/929ad43b40c21b864b166eeeff3e973b_989x200.png) 可以看到是没问题的,所以可以得出如下结论:**在Rust中,变量是一种类似写独占,读共享的状态**。 再来看一个有意思的情况: ```rust fn main() { let s1 = String::from("hello"); let s2 = s1; println!("{:?}",s1); println!("{:?}",s2); } ``` 我感觉这段代码在任意一个c/c++,java,php程序员眼里看来都是没问题的,但是我们运行一下代码呢? ![](https://img.kancloud.cn/25/3d/253d0eaae863ad893c8ef51ed2fdcebd_1055x286.png) 可以看到报错了,说**变量s1已经被借走了**,是不是更有趣了,难怪都说Rust很安全。这是不是忒安全了