gpt4 book ai didi

rust - 匹配语句中明显未使用的变量

转载 作者:行者123 更新时间:2023-12-02 18:10:03 25 4
gpt4 key购买 nike

我正在实现一个简单的图书馆系统来跟踪我的 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>

}

为此,我需要遍历 entriesfilter只有 .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_UNUSED subject_pred 中的局部变量是“未使用”。我大吃一惊,因为我的语法清楚地表明了与传递的 subject_UNUSED 相匹配的意图。 .当我在条目向量上测试此函数时,谓词 always 返回 true(因此我收到“未使用”警告的原因)但我完全不知道为什么。

如果有人能解释为什么 match语句总是匹配的,将不胜感激。我尝试使用常规 match声明,但弹出相同的警告,这不是我试图编码的行为。如果我不包括 subject_UNUSED在传统的 match语句,编译器告诉我必须覆盖 Math , Programming , CompSci , Language , MiscNone我的枚举的变体,这向我表明直到那一点之前的一切都很好。

最佳答案

您不能匹配变量。你所做的相当于

matches!(&e.subject, some_subject)

匹配任何 Subject , 就像通配符 ( _ ) 一样,除了它还在 some_subject 中捕获它变量(可以用在类似 matches!(&e.subject, subject_UNUSED if subject_UNUSED == ...) 的守卫中)。捕获的变量和参数(被它遮蔽)都没有被使用。

你需要做的是#[derive(PartialEq)]然后使用 == :

if e.subject == subject_UNUSED { ... }

顺便说一句,你的代码还有其他问题:你没有move进入闭包,你正在使用拥有的条目但产生借来的。

关于rust - 匹配语句中明显未使用的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72537643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com