是否存在用于构造包含对临时引用的结构的单行语法?

时间:2019-01-19 08:02:47

标签: 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

我可以按照{@ 1}}的绑定进行编译,使之正常工作

let

但是,突然之间,我需要两行代码来完成与实例化fn main() { let bar = &Bar::empty(); let foo = Foo::new(bar); println!("{}", foo.bar.value); } 一样琐碎的事情。有没有简单的方法可以解决此问题?

1 个答案:

答案 0 :(得分:1)

否,除了您键入的语法外,没有其他语法。

有关引用临时文件的寿命的详细信息,请参见:


  

会有一个父结构同时拥有bar和引用它的foo s。

祝你好运: