Могу ли я создать привязку с типом `Option<& str>`?
Могу ли я создать привязку с типом Option<&str>
? Крошечный нерабочий пример:
fn main() {
let a: Option<&str> = {
Some(&{"a".to_string() + "b"}) // Let's say the string is not static
};
}
Это не работает, мне нужно добавить время жизни (или использовать Option<String>
без &
). Так как я могу объявить здесь жизнь? Я знаю, что могу вернуть Option<String>
и все будет хорошо, но это не то, что я хочу - я пытаюсь понять некоторые механики Rust. Я могу объявить время жизни в функции, но не знаю, как это сделать в простом let
связывание.
3 ответа
Абсолютно:
fn main() {
let s = "a".to_string() + "b";
let a: Option<&str> = Some(&s);
}
Проблема не в создании Option<&str>
это то, что вы пытаетесь сослаться на что-то, что вышло за рамки. Это (часть) сообщения об ошибке для исходного кода:
error: borrowed value does not live long enough
|> Some(&{"a".to_string() + "b"})
|> ^^^^^^^^^^^^^^^^^^^^^^^ does not live long enough
См. Возвращение локальной строки в качестве среза (&str) для получения дополнительной информации.
Вам нужно продлить срок жизни строки за пределы a
Выражение инициализатора, связывая его с другим именем:
fn main() {
let x: String = "a".to_string() + "b";
let a: Option<&str> = {
Some(&x)
};
}
Вы пытаетесь сохранить ссылку на значение, которое не живет достаточно долго, как в сообщении об ошибке:
3 |> Some(&{"a".to_string() + "b"}) // Let's say the string is not static
|> ^^^^^^^^^^^^^^^^^^^^^^^ does not live long enough
Вы можете иметь привязку типа Option<&str>
, но ссылка должна жить дольше, чем привязка. В вашем примере вы создаете привязку к результирующей строке, а затем ссылаетесь на нее:
fn main() {
let x: String = "a".to_string() + "b";
let a: Option<&str> = Some(&x);
}