Ответ 1
Нет, вы не можете этого сделать. Есть как минимум два объяснения, почему это так.
Во-первых, помните, что ссылки заимствованы, т.е. указывают на некоторые данные, но не владеют им, они принадлежат кому-то другому. В этом конкретном случае строка, срез, к которой вы хотите вернуться, принадлежит функции, потому что она хранится в локальной переменной.
Когда функция выходит, все ее локальные переменные уничтожаются; это включает вызов деструкторов, а деструктор String
освобождает память, используемую строкой. Однако вы хотите вернуть заимствованную ссылку, указывающую на данные, выделенные для этой строки. Это означает, что возвращаемая ссылка немедленно становится свисающей - она указывает на недопустимую память!
Rust был создан, среди всего прочего, для предотвращения таких проблем. Поэтому в Rust невозможно вернуть ссылку, указывающую на локальные переменные функции, что возможно на таких языках, как C.
Есть еще одно объяснение, немного более формальное. Посмотрите на свою подпись функции:
fn return_str<'a>() -> &'a str
Помните, что параметры времени жизни и общие параметры, ну, параметры: они устанавливаются вызывающей функцией. Например, некоторая другая функция может называться так:
let s: &'static str = return_str();
Для этого требуется 'a
быть 'static
, но это, конечно, невозможно - ваша функция не возвращает ссылку на статическую память, она возвращает ссылку со значительно меньшим временем жизни. Таким образом, такое определение функции является необоснованным и запрещено компилятором.
В любом случае, в таких ситуациях вам нужно вернуть значение принадлежащего ему типа, в этом конкретном случае оно будет принадлежать String
:
fn return_str() -> String {
let mut string = String::new();
for _ in 0..10 {
string.push_str("ACTG");
}
string
}