【发布时间】:2022-06-19 06:13:02
【问题描述】:
我正在实施一个简单的图书馆系统来跟踪我的 pdf。
我有一个Subject 枚举和一个Entry 结构,定义如下:
pub enum Subject {
Math,
Programming,
CompSci,
Language,
Misc,
None
}
pub struct Entry {
pub subject: Subject
}
我正在尝试实现一个函数,该函数将对Entry 的向量进行操作并返回一个Vec<&Entry>,其条目与给定的Subject 匹配。
我有一个简单的 Library 结构,它是 Vec<Entry> 的包装器:
pub struct Library {
pub entries: Vec<Entry>
}
为此,我只需要遍历entries 和filter 的元素,其.subject 字段对应于所需的subject。为此,我创建了一个返回谓词函数的函数。
这里是get_subject 函数:
impl Library {
pub fn get_subject(&self, subject: Subject) -> Vec<&Entry> {
let pred = subject_pred(subject);
self.entries.iter().filter(pred).collect::<Vec<&Entry>>()
}
}
调用函数subject_pred来创建正确的谓词函数:
// Return a PREDICATE that returns true when
// the passed ENTRY matches the desired SUBJECT
fn subject_pred(subject_UNUSED: Subject) -> impl FnMut(&&Entry) -> bool {
|e: &&Entry| if matches!(&e.subject, subject_UNUSED) {
true
} else {
false
}
}
这是问题。这种语法编译得很好,但显然subject_pred 中的subject_UNUSED 局部变量是“未使用的”。我大吃一惊,因为我的语法清楚地表明了与传递的subject_UNUSED 匹配的意图。当我在一个条目向量上测试这个函数时,谓词 always 返回 true(因此我收到“未使用”警告),但我真的不知道为什么。
如果有人能解释为什么match 语句总是匹配,那将不胜感激。我尝试使用常规的match 语句,但弹出了相同的警告,这不是我要编码的行为。如果我在传统的match 语句中不包含subject_UNUSED,编译器会告诉我必须覆盖Math、Programming、CompSci、Language、Misc 和@987654351 @ 我的枚举的变体,这向我表明在那之前的一切都很好。
【问题讨论】:
-
这个签名 -
pub fn get_subject(entries: Vec<Entry>, subject: Subject) -> Vec<&Entry>- 是行不通的:你不能拿一个拥有的Entry并产生一个借来的。 -
我实际上有一个
Library结构,它只是一个Vec<Entry>的包装器,但我不想包含它以使事情复杂化。我会将它们包含在透明度编辑中