由于我正在探索Rust,我試圖撰寫一個Rust函式,可以查看任何字串的可迭代性。
我最初的嘗試是
fn example_1(iter: impl Iterator<Item=&str>)。)
fn example_2(iter: impl Iterator<Item=&String>)。)
/ ...
這需要兩個函式來處理不同的情況。
我還試著把上面的情況合并成一個,我得到的結果是:
我還試著把上面的情況合并成一個。
fn example_3<'a, T: 'a ? Sized Deref<str>>(iter: impl Iterator<Item=&'a T>)。)
這可以接受Iterator<Item=&String>和Iterator<Item=&str>,但不能接受Iterator<String>(因為最后一種需要在函式體中多借一個)。此外,它看起來比它可能應該的要復雜得多。
我當然可以使用自定義的trait來實作,也許涉及到AsRef,但是我想我可能錯過了一個更好更清晰的方法。
uj5u.com熱心網友回復:
你可以使用兩個泛型來更容易地做到這一點,一個表示字串型別,一個表示迭代器。雖然你可以用Deref來做這個,但AsRef trait在這里會更好,因為對于一個給定的型別,可以有多個AsRef實作,而且它更通用一些。這里有一個例子,它將適用于&str、&String、String,等等。
fn example<S。AsRef<str>, T: Iterator< Item=S>>(iter: T) {
for string in iter {
println!("String: {}", string.as_ref())。)
}
uj5u.com熱心網友回復:
這是std::borrow::Borrow的一個優秀用例。Borrow適用于那些可以合理地借入一個看起來相似但實際上不完全相同的型別(String借入&str,PathBuf借入&Path,等等)
fn example<'a, I, T> (iter: I)
where I : Iterator<Item=T> 。
T : Borrow<str> {
for x in iter {
let my_string: &str = x.borrow()。
// ...。
}
注意,這將對String和&str起作用,但不是像你在例子中建議的那樣,對&String起作用。如果你最終得到一個&String的迭代器,那么你可能會質疑你是如何得到的(&String是無用的,原因與&Vec<T>相同;它在各個方面都比&str客觀地差)。但是,如果你因為某些原因得到了一個&String的迭代器,你可以通過
&str。
my_iter.map(|x| & **x))。
一個*擺脫了&,一個*將String轉指為str,然后&借用了str。恭喜你!你是一個 你現在是一個二星級程式員。
或者,更簡單(謝謝,用戶4815162342),
my_iter.map(|x| x.as_str()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/307882.html
標籤:
上一篇:從資料框中洗掉子字串
