Ваша структура данных
pub struct SomeDataType<'a> {
lines: Vec<&'a str>,
}
хранит ссылки на строковые фрагменты. Поскольку ссылки на Rust всегда должны быть действительными, эти кусочки строк должны жить дольше, чем экземпляр SomeDataType
, а время жизни каждого кусочка строки должно быть не менее 'a
.
Ваша функция replace_placeholder()
создает новый локальный экземпляр String
в этой строке:
let newstr = format!("## {}", real_value);
Этот экземпляр String
живет только для среды выполнения функции, поскольку это локальная переменная. Чтобы иметь возможность хранить ссылку на эту строку в self.lines
, она должна, по крайней мере, жить в течение жизни 'a
из SomeDataType
, а это не так. Вот почему компилятор жалуется.
С вашей текущей структурой данных вы не сможете сделать эту работу. Любая строка, которую вы создаете в replace_placeholder()
, будет жить только для времени выполнения функции, если только вы не можете передать владение этой строкой в более долгоживущую структуру данных. SomeDataType
не может вступить во владение, хотя - он только хранит ссылки.
Самое простое решение - изменить определение типа данных на
pub struct SomeDataType {
lines: Vec<String>,
}
так что он владеет всеми строками. Это потребует от вас создания новых String
объектов из разбираемых строк, поэтому вы скопируете все строки. Это вряд ли будет проблемой, но если по какой-то причине вам необходимо избежать этих издержек, вы также можете использовать вектор Cow<'a, str>
. Эта структура данных может хранить либо ссылку, либо собственную строку.