Rust中的可變引用(存在一些問題)

2022-09-19 16:54:12 字數 1458 閱讀 8264

示例程式:

fn main() ", s);  // 輸出 yuyoubei

}fn make_yuyoubei(s: &mut string)

使用使用&mut來修飾函式呼叫時的可變引用;函式宣告時也需要&mut來修飾函式型別。

例如下面的程式是錯誤的:

fn main() , r2 = {}", r1, r2);

}

會提示出錯:

error[e0499]: cannot borrow `s` as mutable more than once at a time 

--> src\main.rs:5:14

|4 | let r1 = &mut s;

| ------ first mutable borrow occurs here

5 | let r2 = &mut s;

| ^^^^^^ second mutable borrow occurs here

6 |

7 | println!("r1 = {}, r2 = {}", r1, r2);

| -- first borrow later used here

在rust中使用這條限制性規則(即同一作用域中不能對同一變數宣告兩個可變引用)可以有效避免資料競爭。

資料競爭(data race)會在指令滿足如下 \(3\) 個條件時發生:

兩個或兩個以上的指標同時訪問同一空間;

其中至少有乙個指標會向空間中寫入資料;

沒有同步資料訪問的機制。

例如下面的程式時錯的:

fn main() ", r1);    // 正確,輸出 r1 = yuyoubei

let r2 = &s;

println!("r2 = {}", r2); // 正確,輸出 r2 = yuyoubei

let r3 = &mut s;

println!("r3 = {}", r3); // 錯誤!

}

雖然書上說有問題,但是實際我是可以正常執行的,執行結果:

r1 = yuyoubei

r2 = yuyoubei

r3 = yuyoubei

也就是說我這個程式不光能編譯,還能夠正常執行。也就是說程式原本第11行注釋「錯誤!」前面地內容,我是能夠正確執行的。

所以我也不確定不能在擁有不可變引用的同時建立可變引用這一點目前是否仍然成立。因為書本對應的rust版本是rust 2018,而我使用的rust版本是 rust 1.58.0(rust 2021)。

Python中可變序列的一些坑

聽說面試官比較喜歡這些坑。預設引數有個最大的坑,演示如下 先定義乙個函式,傳入乙個 list,新增乙個end再返回 def add end l end return l當你正常呼叫時,結果似乎不錯 add end 1 2,3 1 2,3 end add end x y z x y z end 當你使...

Python可變序列中的一些坑

聽說面試官比較喜歡這些坑。函式預設引數可變 預設引數有個最大的坑,演示如下 先定義乙個函式,傳入乙個 list,新增乙個end再返回 def add end l end return l當你正常呼叫時,結果似乎不錯 add end 1 2,3 1 2,3 end add end x y z x y ...

Parallels Desktop 的一些問題

並且無法進行su命令,提示 authentication failure。這個問題產生的原因是由於系統預設是沒有啟用root使用者的,需要我們手工進行操作,在命令列介面下,或者在終端中輸入如下命令 sudo passwd password 你當前的密碼 enter new unix password...