使用 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!");