此方法的返回类型是切片还是借用数组?
我正在阅读 Rust 书,特别是第 8.3 节中的“部门”练习。
我对我创建的方法返回的内容感到有些困惑。
#[derive(Debug, PartialEq, Eq, Hash)]
enum Department {
Sales,
Engineering,
}
#[derive(Debug)]
struct Company {
users: HashMap<Department, Vec<String>>,
}
impl Company {
fn add_user_to_department(&mut self, department: Department, employee: String) {
let users = self.users.entry(department).or_insert(Vec::new());
users.push(employee);
}
fn get_users_in_department(&self, department: Department) -> &[String] {
match self.users.get(&department) {
Some(u) => &u,
None => &[]
}
}
}
起初我认为该方法get_users_in_department正在返回Vec(或在None静态文字的情况下)的一部分。
但是在我的match声明中,我没有使用切片语法,而是返回对Vec.
match self.users.get(&department) {
Some(u) => &u,
None => &[]
}
如果我要返回一个切片,我就不必返回 Some(u) => &u[..],
我想我的困惑归结为返回类型get_users_in_department是什么 。它是返回对数组的引用String,还是数组的切片String。由于某种强制,这两种类型是否可以互换?如果可以区分两者,我想如何以及何时返回其中一个?
回答
来自The Rust Reference 中的类型强制:
类型强制是改变值类型的隐式操作。它们在特定位置自动发生,并且在实际强制的类型方面受到高度限制。
以下类型之间允许强制转换:
&T或者&mut T到&U如果T工具Deref<Target = U>。
这种类型的强制称为deref 强制。相关示例:Vec<T>实现Deref<Target = [T]>so&Vec<T>可以强制转换为&[T].
强制只能发生在程序中的某些强制位置;这些通常是所需类型是显式的,或者可以通过从显式类型(无类型推断)传播来派生的地方。可能的强制站点是:
- 函数结果 - 块的最后一行(如果它不是以分号结尾的)或 return 语句中的任何表达式。
例子:
// no type coercion
fn vec_to_vec<T>(vec: &Vec<T>) -> &Vec<T> {
vec
}
// &Vec<T> coerced to &[T] via deref coercion
fn vec_to_slice<T>(vec: &Vec<T>) -> &[T] {
vec
}
操场
为了更直接地回答你的问题,&uinside的类型get_users_in_department是&Vec<String>但它被&[String]编译器强制为你。