gpt4 book ai didi

rust - 错误 : xxx does not live long enough

转载 作者:行者123 更新时间:2023-11-29 08:23:55 25 4
gpt4 key购买 nike

这个有效:

fn user_add<'x>(data: &'x Input, db: &'x mut Database<'x>) -> HandlerOutput {
//let input: UserAddIn = json::decode(&data.post).unwrap();
//let username = input.username.as_bytes();
//let password = input.password.as_bytes();
db.put(b"Hi", b"hello");
//db.delete(username);
Ok("Hi".to_string())
}

这不起作用:

fn user_add<'x>(data: &'x Input, db: &'x mut Database<'x>) -> HandlerOutput {
//let input: UserAddIn = json::decode(&data.post).unwrap();
//let username = input.username.as_bytes();
//let password = input.password.as_bytes();
let my_str = "hi".to_string();
let username = my_str.as_bytes();
db.put(username, b"hello");
//db.delete(username);
Ok("Hi".to_string())
}

编译器输出:

src/handlers.rs:85:17: 85:23 error: `my_str` does not live long enough
src/handlers.rs:85 let username = my_str.as_bytes();
^~~~~~
src/handlers.rs:80:77: 89:2 note: reference must be valid for the lifetime 'x as defined on the block at 80:76...
src/handlers.rs:80 fn user_add<'x>(data: &'x Input, db: &'x mut Database<'x>) -> HandlerOutput {
src/handlers.rs:81 //let input: UserAddIn = json::decode(&data.post).unwrap();
src/handlers.rs:82 //let username = input.username.as_bytes();
src/handlers.rs:83 //let password = input.password.as_bytes();
src/handlers.rs:84 let my_str = "hi".to_string();
src/handlers.rs:85 let username = my_str.as_bytes();
...
src/handlers.rs:84:32: 89:2 note: ...but borrowed value is only valid for the block suffix following statement 0 at 84:31
src/handlers.rs:84 let my_str = "hi".to_string();
src/handlers.rs:85 let username = my_str.as_bytes();
src/handlers.rs:86 db.put(username, b"hello");
src/handlers.rs:87 //db.delete(username);
src/handlers.rs:88 Ok("Hi".to_string())
src/handlers.rs:89 }

我看过几个关于 Rust 生命周期的问题,我认为这本书不是那么清楚的。我仍然使用生命周期作为试验和错误。这个具体案例让我感到困惑,因为我已经多次尝试与编译器作斗争,而这只是我遇到的最后一个错误。如果你有一些 Rust 技能,请考虑编辑书中关于生命周期的部分。

最佳答案

在第一种情况下,b"Hi" 是一个字节字面量,类型为 &'static [u8],表示“u8 的切片”代码 > 具有无限的生命周期”。函数 put 需要一些生命周期 'x,因为 'static live 比任何生命周期都大,Rust 很乐意使用它。

第二种情况

let my_str = "hi".to_string();
let username = my_str.as_bytes();

username 是对 my_str 的内部缓冲区的引用,不能超过它。编译器会报错,因为 put 的第一个参数的生命周期 'xmy_str 的生命周期更宽(user_add 的本地参数)。 Rust 不允许你这样做,因为 db 会在函数调用结束时指向悬空数据:

user_add(input, &mut db);
// `my_str` was local to `user_add` and doesn't exist anymore
// if Rust had allowed you to put it in `db`, `db` would now contain some invalid data here

关于rust - 错误 : xxx does not live long enough,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38163126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com