我可以创建一个类型为“Option<& str>”的绑定吗?

时间:2016-07-18 21:22:56

标签: rust lifetime

我可以使用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 个答案:

答案 0 :(得分:2)

绝对:

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

有关详细信息,请参阅Return local String as a slice (&str)

答案 1 :(得分:1)

您需要通过将字符串绑定到另一个名称来延长字符串的生命周期超过a的初始化表达式:

fn main() {
    let x: String = "a".to_string() + "b";
    let a: Option<&str> = {
        Some(&x)
    };
}

答案 2 :(得分:1)

您正在尝试保留对值不够长的值的引用,例如错误:

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);
}