Я нахожусь в процессе изучения 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()
?