struct - 是否有用于构造包含对临时对象的引用的结构的单行语法?

标签 struct rust borrow-checker

考虑以下无效的 Rust 代码。有一个结构 Foo 包含对第二个结构 Bar 的引用:

struct Foo<'a> {
    bar: &'a Bar,
}

impl<'a> Foo<'a> {
    fn new(bar: &'a Bar) -> Foo<'a> {
        Foo { bar }
    }
}

struct Bar {
    value: String,
}

impl Bar {
    fn empty() -> Bar {
        Bar {
            value: String::from("***"),
        }
    }
}

fn main() {
    let foo = Foo::new(&Bar::empty());
    println!("{}", foo.bar.value);
}

编译器不喜欢这样:

error[E0716]: temporary value dropped while borrowed
  --> src/main.rs:24:25
   |
24 |     let foo = Foo::new(&Bar::empty());
   |                         ^^^^^^^^^^^^ - temporary value is freed at the end of this statement
   |                         |
   |                         creates a temporary which is freed while still in use
25 |     println!("{}", foo.bar.value);
   |                    ------------- borrow later used here
   |
   = note: consider using a `let` binding to create a longer lived value

我可以按照编译器所说的进行操作 - 使用 let 绑定(bind):

fn main() {
    let bar = &Bar::empty();
    let foo = Foo::new(bar);
    println!("{}", foo.bar.value);
}

但是,突然间我需要两行代码来处理像实例化我的 Foo 这样微不足道的事情。有什么简单的方法可以一次性解决这个问题吗?

最佳答案

不,除了您输入的内容外,没有这样的语法。

有关当您引用临时临时文件时它能存活多长时间的详细信息,请参阅:


There will be a parent struct owning both the bar and the foos referencing it.

祝你好运:

关于struct - 是否有用于构造包含对临时对象的引用的结构的单行语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58948512/

相关文章:

rust - 从 HashMap 或 Vec 返回引用会导致借用超出其所在范围?

c - 将数组结构作为数组传递

struct - 如何转换作为结构体内部字段的枚举?

c# - 将 VB6 结构导入 C#

rust - 为什么无法使用方括号 [ ] 表示法更新 HashMap 中的值?

linked-list - 是否可以在 Rust 中将一个结构的内存与另一个结构相关联?

hashmap - 如何有效地从 HashMap 中查找和插入?

string - 无法使用 if 表达式附加到字符串而不是 if 语句

c - 静态结构初始化 C

rust - 在嵌套的 lambda 中借用局部变量