Rust 如何交換Vec型別中資料的位置?

2021-08-08 22:13:11 字數 1549 閱讀 6501

在指令碼語言中,要把vec<>中兩兩值進行對調,這個是太過於輕鬆的事情不過了。但是對於rust而言,還是有些麻煩。

一、如何對vec<&str>兩兩值進行對調?

fn

swap(

vec: vec<&str>, i: usize, j: usize) -> vec<&str> ,j:{} is not fit!", i, j);}if

let some(v_i) = v.get_mut(i)

iflet some(v_j) = v.get_mut(j)

println!("before swap vec:", vec);

println!("after swap vec:", v);

v}

fn

main() ", swap(vec!["ab", "bc", "de"], 1, 2));

}

輸出結果:

before swap vec:["ab", "bc", "de"]

after swap vec:["ab", "de", "bc"]

有其它寫法,比如簡化一些?:

fn

swap(

vec: vec<&str>, i: usize, j: usize) -> vec<&str> ,j:{} is not fit!", i, j);

}// (v.get_mut(i), v.get_mut(j))=>部分報錯

iflet (some(v_i), some(v_j)) = (v.get_mut(i), v.get_mut(j))

println!("before swap vec:", vec);

println!("after swap vec:", v);

v}

以下的寫法可以執行,但結果是不對的,可以看看具體什麼原因造成的。clone()?

fn

swap(

vec: vec<&str>, i: usize, j: usize) -> vec<&str> ,j:{} is not fit!", i, j);}if

let (some(v_i), some(v_j)) = (v.clone().get_mut(i), v.clone().get_mut(j))

// if let some(v_i) = v.get_mut(i)

// if let some(v_j) = v.get_mut(j)

println!("before swap vec:", vec);

println!("after swap vec:", v);

v}

二、標準庫中的用法

在rust中有swap函式,可以直接使用:

let

mut v = ["a", "b", "c", "d"];

v.swap(1, 3);

assert!(v == ["a", "d", "c", "b"]);

rust中的型別

rust提供了幾種機制來實現基本型別和使用者自定義型別的轉換和定義。rust中沒有提供基本型別之間隱式地型別的轉換。但是,我們可以通過as關鍵字來進行顯示型別的轉換。在rust中,數字型別的轉換和c語言中的轉換一樣,除了c語言中的未定義的行為。整數型別之間的所有轉換情況都已經在rust中定義好了。禁...

rust中的型別轉換

tryfrom與tryinto 字串的to與from 基本型別可以通過顯示型別轉換機制 as 來實現相互之間的轉換。rust通過使用trait來處理定製型別 enum struct 之間的型別轉換。通用的型別轉換一般使用的trait為from和to。然而,對於常見的型別轉換場景,有更多具體的trai...

如何理解 rust 中的 Sync Send?

sync和send是 rust 安全併發中兩個至關重要的marker,但絕大多數的文件或書籍每當談到它們就只是直接丟擲它們的語義 導火索 rwlock 我之所以決定徹底搞清楚這兩個東西是因為我使用標準庫中的rwlock遇到了一些問題,檢視原始碼之後發現這兩行 先不管send stable featu...