Могу ли я создать привязку с типом `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);
}
Другие вопросы по тегам