我正在学习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]
明显可见,写上“get_users_in_department
的返回类型是&Vec<String>
”不会有点混淆吗?是否更好地说:“get_users_in_department
的返回类型是&[String]
(一个切片引用),因为这是代码中所写的,这是如何实现的?” - Michał Politowski