我想为定制 struct 实现DeRef特征,并返回&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
    }
}

编译器诊断:cannot return reference to local variable 'txt'. returns a reference to data owned by the current function.

我查看了一些关于堆栈溢出的答案,例如(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)
    }
}

为什么它可以在这里返回函数持有的引用?

如果有人能帮上忙,我将不胜感激.

推荐答案

为什么它可以在这里返回函数持有的引用?

因为Path在运行时是a transparent wrapper around an OsStr,所以它们是the exact same thing.所以我们可以从PathBufreinterpretit中得到OsStr.从安全的Angular 来看,只要这两个函数完全对齐,就等同于从内部类型返回一个普通引用.

Rust相关问答推荐

在HashMap中插入Vacant条目的可变借位问题

展开枚举变量并返回所属值或引用

Box::new()会从一个堆栈复制到另一个堆吗?

为什么铁 rust S的默认排序功能比我对小数组的 Select 排序稍微慢一些?

如何使用RefCell::JOYMOMTborrow 对 struct 不同字段的可变引用

获取已知数量的输入

装箱特性如何影响传递给它的参数的生命周期 ?(举一个非常具体的例子)

为什么我需要 to_string 函数的参考?

将特征与具有生命周期的关联类型一起使用时的生命周期方差问题

如何迭代存储在 struct 中的字符串向量而不移动它们?

一次不能多次borrow *obj作为可变对象

通过mem::transmute将数组展平安全吗?

Rust typestate 模式:实现多个状态?

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

分配给下划线模式时会发生什么?

类型判断模式匹配panic

用逗号分隔字符串,但在标记中使用逗号

Cargo:如何将整个目录或文件包含在功能标志中?

在 Rust 中枚举字符串的最佳方式? (字符()与 as_bytes())

为什么一个整型变量赋值给另一个变量后仍然可以使用?