Estou usando a solução nesta questão:
https://stackoverflow.com/a/56925633/1634905
Meu código se parece com:
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
}
Isso não compila e dá um erro:
`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`
Captura de tela do erro:
Se eu comentar a linha let _ = socket.join(room);
, o erro não será mais gerado. Por que isso?
A join()
função é da rust_socketio
caixa:
https://github.com/1c3t3a/rust-socketio/tree/main
Se parece com isso:
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;
}
Isso diz que tudo o que você passa
join()
deve ser de um tipo que implementeRoomParam
.Isto diz que um dos requisitos da implementação
RoomParam
é que seja'static
. Como você passou a&'a str
, o compilador conclui isso'a = 'static
. Isto requer então, através da assinatura deget_room_header()
,que
socket
também pode ser emprestado para'static
. Mas não é, e na verdade você o descarta no final da função, então obtém um erro “o valor emprestado não dura o suficiente”.Agora, quanto à solução do problema, a coisa geral a ter em mente é: se você receber um erro informando que algo deve ser emprestado
'static
, isso na maioria das vezes significa que não deveria ser emprestado de forma alguma . Não tente usar a&str
comoRoomParam
- use um valor próprio.Se formos à documentação do
RoomParam
, podemos ver que ele está implementado para vários tipos e você provavelmente deveria usarString
- ou seja, convertê-lo&str
paraString
: