此方法的返回类型是切片还是借用数组?

我正在阅读 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]编译器强制为你。


以上是此方法的返回类型是切片还是借用数组?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>