Руст владение по ссылке? - PullRequest
       59

Руст владение по ссылке?

1 голос
/ 05 марта 2020

Я нахожусь в процессе изучения Rust, и есть некоторые функции, связанные с владением и ссылками, которые постоянно вводят меня в заблуждение:

struct ThingOne {
    value: u32
}

// Assume I can't change this signature to simply own thing_ref.  Maybe
// it's from third-party code.
struct ThingTwo<'a> {
    thing_ref: &'a ThingOne
}

fn test<'a>() -> ThingTwo<'a> {
    let thing1 = ThingOne { value: 1 };

    ThingTwo { thing_ref: &thing1 }
}

Очевидно, что это не может работать - thing1 выделено для стека , ссылка не может безопасно избежать функции. Тем не менее, этот шаблон кажется распространенным, и я не могу найти хорошего обходного пути. Я мог бы изменить тип возвращаемого значения на кортеж (ThingOne, ThingTwo), чтобы вызывающая сторона перешла в собственность thing1, но тогда я все равно столкнулся бы с проблемами, пытаясь создать эту ссылку на thing1 при инициализации результата ThingTwo. Я мог бы использовать Rc<ThingOne>, но это похоже на очень сложное решение.

Есть ли идиоматический c способ обработки такого рода кода? Или есть какой-то другой подход, который лучше, чем структурированная функция test()?

...