我在Rust编译器中犯了一个终生/borrow 错误,我无法理解.问题似乎是Rust假设,当一个参数被传递给一个返回静态值引用的函数时,该参数引用也必须是静态的.

#[derive(Debug)]
struct TestThingy<'a> {
    label: &'a str,
}

const TEST_VALUES: [TestThingy; 3] = [
    TestThingy { label: "one" },
    TestThingy { label: "two" },
    TestThingy { label: "three" },
];

pub fn value_for_num(num: &str) -> Option<&'static TestThingy> {
    TEST_VALUES.iter().find(|value| value.label == num)
}

pub fn test_out_thingy() {
    let tmp_val = String::from("two");
    if let Some(test_thingy) = value_for_num(&tmp_val) {
        println!("test_thingy: {:?}", test_thingy);
    }
}

fn main() {
    test_out_thingy();
}

Rust错误:error[E0597]: `tmp_val` does not live long enough-E0597指的是当一个值被删除,而它仍然被borrow ,这在这里没有发生-我不知道如何说服Rust.

这段代码背后的 idea 是,为了获得更多的上下文,它是编译时/静态配置的一种查找机制(在我的代码库中,它们是Syntax个值,根据提供的文件名&str进行匹配).因此,提供的参数实际上没有静态配置有效,但我不明白为什么这是一个问题.返回的值不包含参数作为引用,所以我非常不清楚为什么会发生这种borrow 错误.

推荐答案

问题在于value_for_num的函数签名.

您指示返回对TestThingy的静态引用,但没有指示TestThingy<'x>可能包含什么类型的引用.因此,编译器假定未指定的输入引用生存期可能与TestThingy引用的未指定输出生存期相关联.

i、 e.编译器看到:

pub fn value_for_num<'a>(num: &'a str) -> Option<&'static TestThingy<'a>>

如果更改签名以指定包含的引用也是静态的,那么它将编译.

pub fn value_for_num(num: &str) -> Option<&'static TestThingy<'static>>

Rust相关问答推荐

从Rust调用C++虚拟方法即使在成功执行之后也会引发Access违规错误

为什么复印是豆荚的一个重要特征?

使用pyo3::Types::PyIterator的无限内存使用量

为什么`Vec i64`的和不知道是`Option i64`?

如果LET;使用布尔表达式链接(&Q);

重写Rust中的方法以使用`&;mut self`而不是`mut self`

创建Rust中元对象协议的动态对象 Select /重新分配机制

字段类型为Boxed的 struct 的生存期必须超过static

什么时候使用FuturesOrdered?

在 Rust 中,在需要引用 self 的 struct 体方法中使用闭包作为 while 循环条件

确保参数是编译时定义的字符串文字

如何在 `connect_activate()` 之外创建一个 `glib::MainContext::channel()` 并将其传入?

实现泛型的 Trait 方法中的文字

如何将 Rust 字符串转换为 i8(c_char) 数组?

哪些特征通过 `Deref` 而哪些不通过?

如何在 Rust Polars 中可靠地连接 LazyFrames

如何解析 Rust 中的 yaml 条件字段?

需要括号的宏调用中的不必要的括号警告 - 这是编写宏的糟糕方法吗?

如何重写这个通用参数?

当值是新类型包装器时,对键的奇怪 HashMap 生命周期要求