gpt4 book ai didi

string - 当我在单个函数或仅在主函数中使用时,字符串文字的 Rust 引用表现不同

转载 作者:行者123 更新时间:2023-12-05 00:51:59 25 4
gpt4 key购买 nike

我最近正在学习所有权和生命周期。但是我发现关于字符串文字的一个奇怪的情况。

//! work perfectly

fn foo() -> &'static str {
let a = "66";
&a
}

fn main() {
let b = foo();
println!("{}", b);
}

当我像上面那样使用字符串文字时,它工作得很好。但是当我像下面这样使用它时:

//! broken

fn main() {
{
let b;
{
let a = "66";
b = &a;
}
println!("{}", b);
}
}

它坏了,告诉我:

b = &a;
^^ borrowed value does not live long enough

这些让我很困惑。为什么它们不同?

请帮助我,非常感谢。

最佳答案

这两个程序的区别在于自动解引用。

//! work perfectly

fn foo() -> &'static str {
let a = "66";
&a // the type of this expression is not &'static str it is &&'static str
}

fn main() {
let b = foo();
println!("{}", b);
}

由于 a 的类型是 &'static str &a 的类型是 &&'static str .注意第二个引用。它是对没有静态生命周期的字符串的引用,而不是字符串值。但是,由于 foo返回类型为 &'static str , &a自动取消引用到 ab 的类型推断为&'static str .在第二个程序中,由于类型不明确,因此不会发生这种情况,因此 b 被推断为 &&'static str它引用了一个只在 block 的生命周期内存在的引用。

如果更新第二个程序以显式声明 b 的类型,您将获得相同的效果。

但是,更好的方法是完全不依赖自动取消引用,并使用以下两个程序之一:

fn foo() -> &'static str {
let a = "66";
a // note no &
}

fn main() {
let b = foo();
println!("{}", b);
}

或者

fn main() {
{
let b;
{
let a = "66";
b = a; // Again no &
// In idiomatic code it would probably make sense to inline the
// assignment, but I have left it in for clarity with the original code
}
println!("{}", b);
}
}

关于string - 当我在单个函数或仅在主函数中使用时,字符串文字的 Rust 引用表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70730274/

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