我想为自定义结构实现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)
}
}
型
为什么它可以在这里返回函数持有的引用?
如果有人能帮忙我会很感激的。
2条答案
按热度按时间vybvopom1#
为什么它可以在这里返回函数持有的引用?
因为
Path
是OsStr
的透明 Package 器,在运行时,它们是 * 完全相同的东西 *。所以我们可以从PathBuf
中获取OsStr
并 * 重新解释 * 它。从安全的Angular 来看,只要两者完美地对齐,就相当于从内部类型返回普通引用。esyap4oy2#
为什么它可以在这里返回函数持有的引用?
因为它没有返回一个由函数持有的引用,而是返回一个由
self
持有的引用,函数在其参数中借用了这个引用。所以最终这个引用由拥有self
的调用者持有。