Рассмотрим следующий неверный код 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
:
fn main() {
let bar = &Bar::empty();
let foo = Foo::new(bar);
println!("{}", foo.bar.value);
}
Однако внезапно мне нужны две строки для чего-то столь же тривиального, как создание моего Foo
. Есть ли простой способ исправить это в однострочнике?