【问题标题】:Can I have non-static struct inside a static vector我可以在静态向量中有非静态结构吗
【发布时间】:2019-07-21 23:48:10
【问题描述】:

我有一个服务器应用程序,我想将套接字和其他信息保存在向量中。现在,为方便起见,我想使用可通过 Mutex game_sessions 访问的全局静态向量。

我知道在 Rust 中保留全局对象并不是最好的主意,但由于这主要是原型工作,它会大大简化这部分。

错误可以在下面找到,但它要求为 PlayerSession 的 Option<&TcpStream> 属性提供生命周期说明符。

我假设它要求一个 `static 生命周期说明符。现在,我知道 Mutex 和 Vec 将具有静态生命周期,但我不明白为什么向量内的元素必须是静态的。

有什么办法可以使这项工作?我知道还有其他方法可以做到这一点,但我想知道为什么这种特定方法不起作用。

use std::net::{TcpStream};
use std::sync::*;

#[derive(PartialEq)]
pub enum SessionState {
    Closed,
    Active
}

pub struct PlayerSession {
    pub state: SessionState,
    pub player_socket: Option<&TcpStream>
}

lazy_static! {
    static ref game_sessions: Mutex<Vec<PlayerSession>> = Mutex::new(vec![]);
}

pub fn create_player_session(client_socket: &TcpStream) {

    let mut x = game_sessions.lock().unwrap();
    x.push(PlayerSession {
        state: SessionState::Closed,
        player_socket: Some(client_socket)
    });
}

编译时报错:

error[E0106]: missing lifetime specifier
  --> src\sessions.rs:12:31
   |
12 |     pub player_socket: Option<&TcpStream>
   |                               ^ expected lifetime parameter

还在学习这门语言,请原谅代码质量不佳,继续努力。

【问题讨论】:

    标签: rust


    【解决方案1】:

    有了这个:

    pub struct PlayerSession {
        pub state: SessionState,
        pub player_socket: Option<&TcpStream>
    }
    

    你告诉 rust PlayerSession 可能包含对 TcpStream 的引用。

    如果您想在此数据结构中安全地存储对套接字的引用,则需要指定套接字所有者(代码示例中未显示)与PlayerSession 结构之间的生命周期关系。否则,编译器无法验证套接字是否可能被丢弃并留下悬空引用。

    PlayerSession 结构恰好存储在静态 Vec 中这一事实并没有改变这一点。

    如果您实际上不需要对套接字进行共享访问,最简单的解决方案可能是让PlayerSession 拥有该套接字,而不是仅仅引用它。

    【讨论】:

    • 我明白了!我会尝试用这个更新我的代码。谢谢,告诉你进展如何。
    • 好的,所以我尝试使用您建议的新结构调整代码,但我没有设法掌握我需要在代码中添加的生命周期。相反,我改变了我的方法以避免使用静态值,而是选择了在更高范围创建的向量并向下传递给需要引用它的依赖项。你的答案是正确的,所以我会接受它。
    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    相关资源
    最近更新 更多