gpt4 book ai didi

rust - 为什么我可以返回对函数拥有值的引用?

转载 作者:行者123 更新时间:2023-11-29 08:15:32 25 4
gpt4 key购买 nike

The Rust Programming Language 的第 19.2 章中,以下示例编译没有任何错误。我从issue #1834发现有一个新的生命周期省略规则隐含地使 's长于 'c .

虽然我找不到这个新省略规则的详细解释,但我猜它不过是只是更长、更明确的约束的隐式版本:<'c, 's: 'c> .不过,我认为我的困惑可能与这条新的省略规则无关,但我当然可能对此有误。

我的理解是,parse_context取得 context 的所有权因为它没有被借用,而是实际上被移动到函数中。仅此一项就意味着 context 的生命周期无论我们在 Context 中定义的生命周期和约束如何,它都应该匹配它所拥有的函数的生命周期。 , 和 Parser .

根据这些定义,context 所在的部分超过临时Parser对我来说很有意义(毕竟,我们定义了更长的生命周期),但是 &str 所在的部分context 时引用不会被删除在 parse_context 结束时超出范围而且我仍然可以安全地返回——这让我很困惑。

我错过了什么?编译器如何推断返回的 &str 的生命周期? ?

更新示例

struct Context<'s>(&'s str);

struct Parser<'c, 's>
{
context: &'c Context<'s>,
}

impl<'c, 's> Parser<'c, 's>
{
fn parse(&self) -> Result<(), &'s str>
{
Err(self.context.0)
}
}

fn parse_context(context: Context) -> Result<(), &str>
{
Parser { context: &context }.parse()
}

fn main()
{
let mut s = String::new();
s += "Avail";
s += "able?";
if let Err(text) = parse_context(Context(&s))
{
println!("{}", text);
}
}

最佳答案

没有返回对函数拥有值的引用。您正在返回传入的引用的副本。

您的函数是恒等函数的精巧版本:

fn parse_context(s: &str) -> &str {
s
}

在您的实际代码中,您引用一个包含字符串切片的结构,然后引用另一个字符串切片,但所有这些引用都被丢弃。

例如,parse 中有一个不需要的引用:

fn parse(&self) -> Result<(), &'s str> {
Err( self.context.0)
// ^ no & needed
}

此外,如果您启用更多的 lints,您将被迫为您的函数签名添加更多的生命周期,这可能会使事情变得更加清晰:

#![deny(rust_2018_idioms)]

fn parse_context(context: Context<'_>) -> Result<(), &'_ str> {
Parser { context: &context }.parse()
}

另见:

Although I couldn't find a detailed explanation of this new elision rule,

T: 'a inference in structs在版本指南中。

关于rust - 为什么我可以返回对函数拥有值的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55820491/

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