我正在使用这个问题中的解决方案:
https://stackoverflow.com/a/56925633/1634905
我的代码如下所示:
fn get_room_header<'a>(socket: &'a SocketRef) -> Option<&'a str> {
socket.req_parts().headers.get("room")?.to_str().ok()
}
async fn on_connect(socket: SocketRef) {
println!("on_connect");
let Some(room) = get_room_header(&socket) else {
println!("No room sent: {:?}",socket.req_parts());
_ = socket.disconnect();
return;
};
// println!("Room: {:?}",room);
let _ = socket.leave_all();
let _ = socket.join(room);//if I comment out this line, it no longer throws error
}
这不会编译并给出错误:
`socket` does not live long enough
borrowed value does not live long enough
main.rs(61, 1): `socket` dropped here while still borrowed
main.rs(46, 21): binding `socket` declared here
main.rs(50, 22): argument requires that `socket` is borrowed for `'static`
错误截图:
如果我注释掉该行let _ = socket.join(room);
,那么它就不再抛出错误。这是为什么?
该join()
函数来自rust_socketio
板条箱:
https://github.com/1c3t3a/rust-socketio/tree/main
它看起来像这样:
pub fn join(&self, rooms: impl RoomParam) -> Result<(), A::Error> {
self.ns.adapter.add_all(self.id, rooms)
}
pub trait RoomParam: 'static {
/// The type of the iterator returned by `into_room_iter`.
type IntoIter: Iterator<Item = Room>;
/// Convert `self` into an iterator of rooms.
fn into_room_iter(self) -> Self::IntoIter;
}
这表示您传递给的任何
join()
内容都必须是实现RoomParam
.这说明实施的要求之一
RoomParam
就是它'static
。由于您传递了 a&'a str
,编译器得出结论'a = 'static
: 。然后,这需要通过 的签名get_room_header()
,那
socket
也可以借用'static
。但事实并非如此,事实上,您将其放在函数末尾,因此您会收到“借用的值寿命不够长”错误。现在,关于解决问题,要记住的一般事情是:如果您收到必须借用某些东西的错误
'static
,则通常意味着根本不应该借用它。不要尝试使用 a&str
作为RoomParam
- 使用拥有的值。如果我们查看 的文档
RoomParam
,我们可以看到它是针对多种类型实现的,您可能应该使用String
- 即,将您的转换&str
为String
: