【问题标题】:Rust lifetime issueRust 生命周期问题
【发布时间】:2021-07-08 02:54:55
【问题描述】:
pub fn get_header_authorization() -> (&str, &str) {
    dotenv().ok();
    let str = std::env::var("HEADER_AUTHORIZATION").expect("HEADER AUTHORIZATION must be set!");
    let header:Vec<&str> = str.split('&').collect();
    let (a, b) = (header[0], header[1]);
    (a, b)
}
#[test]
fn test() {
    let authorization = get_header_authorization();
    assert_eq!(authorization.0, "Authorization")
}
error[E0106]: missing lifetime specifier
   --> src\json_function.rs:173:45
    |
173 | pub fn get_header_authorization() -> (&str, &str) {
    |                                             ^ expected named lifetime parameter
    |

【问题讨论】:

  • 你为什么返回&amp;str而不是String?

标签: rust lifetime


【解决方案1】:

Rust 只能在参数中有引用的情况下推断返回类型的生命周期,在这种情况下,它会推断参数和返回类型的生命周期必须相同。这就是您收到此特定错误的原因。不过,这不是代码的问题。

问题是std::env::var返回一个Result&lt;String, VarError&gt;,所以str的类型是String,而String归函数所有。然后,您尝试从函数返回对该字符串的引用。但是当函数返回它拥有的 String 时,它将超出范围并被删除,并且对它的所有引用都将变得无效。 Rust 不允许这样做。要解决这个问题,您可以直接返回字符串:

pub fn get_header_authorization() -> (String, String) {
    dotenv().ok();
    let str = std::env::var("HEADER_AUTHORIZATION").expect("HEADER AUTHORIZATION must be set!");
    let mut header = str.split('&').map(str::to_owned);
    
    let (a, b) = (header.next().unwrap(), header.next().unwrap());
    (a, b)
}

【讨论】:

    猜你喜欢
    • 2021-05-31
    • 1970-01-01
    • 2019-05-22
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    相关资源
    最近更新 更多