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