rust 如何在函数中返回自定义的String引用?

mnemlml8  于 2023-11-19  发布在  其他
关注(0)|答案(2)|浏览(84)

我想为自定义结构实现DeRef trait,并返回&String

use std::ops;
use std::path::Path;

fn main() {
    println! ("hello world");
}

struct MyDir {
    path: String,
}

impl ops::Deref for MyDir {
    type Target = String;

    fn deref(&self) -> &String {
        let txt = format! ("Dir[path = {}]", self.path);
        &txt
    }
}

字符串
编译器诊断:* 无法返回对局部变量“txt”的引用。返回对当前函数 * 拥有的数据的引用。
我在stackoverflow上查看了一些答案,比如(Is there any way to return a reference to a variable created in a function?),他们都说你不能返回一个函数拥有的变量的引用,但后来我看到了std::path::Path中的一个代码片段

[stable(feature = "rust1", since = "1.0.0")]
impl ops::Deref for PathBuf {
    type Target = Path;
    #[inline]
    fn deref(&self) -> &Path {
        Path::new(&self.inner)
    }
}


为什么它可以在这里返回函数持有的引用?
如果有人能帮忙我会很感激的。

vybvopom

vybvopom1#

为什么它可以在这里返回函数持有的引用?
因为PathOsStr的透明 Package 器,在运行时,它们是 * 完全相同的东西 *。所以我们可以从PathBuf中获取OsStr并 * 重新解释 * 它。从安全的Angular 来看,只要两者完美地对齐,就相当于从内部类型返回普通引用。

esyap4oy

esyap4oy2#

为什么它可以在这里返回函数持有的引用?
因为它没有返回一个由函数持有的引用,而是返回一个由self持有的引用,函数在其参数中借用了这个引用。所以最终这个引用由拥有self的调用者持有。

相关问题