我開始了與一個功能有點像這樣(playground):如何推廣一個接受`&[T]`的函數,以便我仍然可以用字符串文字調用它?
fn find <T: Copy> (src: &[T], index: usize) -> T {
// more complex algorithm, involving src goes here
src[index]
}
pub fn main() {
let x = b"abc";
assert_eq!(b'b', find(x, 1));
}
,我想概括它,這樣我可以使用任何適當的類型src
。我想出的最好的是這個(playground):
trait RandomAccess<T> {
fn get_at(&self, index: usize) -> T;
}
impl <T: Copy> RandomAccess<T> for [T] {
fn get_at(&self, index: usize) -> T {
self[index]
}
}
fn find <T: Copy, S: ?Sized + RandomAccess<T>> (src: &S, index: usize) -> T {
// more complex algorithm, involving src goes here
src.get_at(index)
}
pub fn main() {
let x = b"xyz";
assert_eq!(b'y', find(&x[..], 1));
}
不過,我現在不能只是調用find(x, 1)
,我要創建一個切片:find(&x[..], 1)
。
有沒有辦法使這個通用,但仍然能夠像在原始示例中調用find
?
似乎鏽編譯器在第一個例子中在幕後做了一些詭計,並且允許'&[u8; 3]'被強制爲'&[u8]',但在第二個例子中不能這樣做,因爲它不能肯定知道這是意圖。這基本上是問題嗎? –
我試圖通過索引和其他一些東西來抽象化,但我並不確定你需要引入這樣的抽象 - 它們往往使事物複雜化而沒有增值。 find()'可以應用於其他'src'類型的是什麼? –
ljedrz
訣竅是:如果目標類型已知,強制觸發。由於'find'對'src'使用了一個類型參數,它不是。 – bluss