Существует ли однострочный синтаксис для создания структуры, содержащей ссылку на временный объект? - PullRequest
0 голосов
/ 19 января 2019

Рассмотрим следующий неверный код 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. Есть ли простой способ исправить это в однострочнике?

1 Ответ

0 голосов
/ 20 января 2019

Нет, такого синтаксиса нет, кроме того, что вы ввели.

Подробную информацию о том, как долго временная жизнь, когда вы берете ссылку на нее, см .:


Будет родительская структура, владеющая как bar, так и foo, ссылающимися на него.

Удачи:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...