在指令碼語言中,要把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...