<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [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很安全。這是不是忒安全了
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看