使用 Deref 和 AsRef 作為函式引數

對於需要採集物件集合的函式,切片通常是一個不錯的選擇:

fn work_on_bytes(slice: &[u8]) {}

因為 Vec<T> 和陣列 [T; N] 實現了 Deref<Target=[T]>,所以它們很容易被強制轉換為切片:

let vec = Vec::new();
work_on_bytes(&vec);

let arr = [0; 10];
work_on_bytes(&arr);

let slice = &[1,2,3];
work_on_bytes(slice); // Note lack of &, since it doesn't need coercing

然而,作為替代的明確要求切片,該函式可以由接受任何型別的可被用作切片:

fn work_on_bytes<T: AsRef<[u8]>>(input: T) {
    let slice = input.as_ref();
}

在這個例子中,函式 work_on_bytes 將採用任何型別 T 來實現 as_ref(),它返回對 [u8] 的引用。

work_on_bytes(vec);
work_on_bytes(arr);
work_on_bytes(slice);
work_on_bytes("strings work too!");