如何在 if body 中使用变量而不在 Rust 中丢弃它?

How to use variable in if body without dropping it after in Rust?

提问人:mes3n 提问时间:11/7/2023 最后编辑:mes3n 更新时间:11/7/2023 访问量:89

问:

我正在初始化一个结构,然后将结果返回给一个变量,如果结果为 Ok,我想在这个变量上启动一个线程,而不会随后删除它,因为它也会丢弃并停止线程。

let tcp_server: Result<TcpServer> = TcpServer::new(
    settings.server.ip.clone(),
    &settings.http,
    request_handler.clone(),
);
if tcp_server.is_ok() {
    tcp_server.unwrap().start_thread();
    // tcp_server is dropped here
}

IpcListener::new().listen_block();  // Block the main thread

// I want it to be dropped here

有没有办法在结果包装tcp_server上启动线程,前提是结果没问题而不改变其范围,或者有什么替代方案?

多线程 if-statement rust 作用域

评论

0赞 Aleksander Krauze 11/7/2023
您可能应该传播可能在早期发生的错误,并直接使用 .TcpServer::newTcpServer
3赞 Jmb 11/7/2023
请提供一个最小的可重复示例。特别是如何定义?从理论上讲,没有理由让掉线停止......start_threadtcp_server
2赞 Sven Marnach 11/7/2023
你分享的代码肯定不是你的实际代码。 有类型。如果是 Rust 普通类型的实例,则它没有方法。另请注意,没有理由在语句末尾删除。移动是可能的,但无论你怎么称呼它,这都会发生。该语句不会移动,如果不使用它,它将一直存在,直到外部作用域结束。tcp_serverResult<TcpServerResultResultstart_thread()tcp_serverifstart_thread()tcp_serveriftcp_serverstart_server()
0赞 mes3n 11/7/2023
我认为不可能发布实际代码,因为它大约有 700 行,结构非常大。在调用启动线程之前,我确实修改了解包,但用另一种类型替换,问题仍然存在。 Simple 生成一个线程并将其分配给成员。TcpServerTcpServerstart_threadhandle
0赞 cafce25 11/7/2023
实际做什么并不重要,重要的是它是如何定义的,即签名。start_thread

答:

0赞 mousetail 11/7/2023 #1

你的代码显然是不完整的,因为它不可能工作。但是,如果要在条件语句末尾保留可能存在或不存在的内容,则可以使用 :Option

let _server = if let Ok(tcp_server) = tcp_server { // use if let to replace unwrap
    tcp_server.start_thread();
    // tcp_server is dropped here
    Some(tcp_server)
} else { None }

IpcListener::new().listen_block();

只有在删除时才会被丢弃。如果服务器从未存在过,则该选项将存在,并且在删除时不会删除任何内容。tcp_server_serverNone_server

评论

0赞 mes3n 11/7/2023
谢谢,这个解决方案可能是最好的方法。但是是否需要将变量传回 if 主体的范围,或者是否有任何方法可以在不将其移动到该主体的情况下使用if 主体中的变量?tcp_server
0赞 mousetail 11/7/2023
在身体中使用它永远不会将其移动到身体中if
0赞 mes3n 11/7/2023
但是,如果变量从未被移动到体内,为什么它会被丢弃在体内呢?您的解决方案不是简单地将其移入主体,然后将其移回变量吗?ifif_server
0赞 mousetail 11/7/2023
@mes3n 该方法可能会移动 if 作为参数而不是 .start_threadtcp_serverself&self
1赞 Sven Marnach 11/8/2023
如果 OP 使用 ,原始问题就会消失,这可能是他们真正想要的。let tcp_server = TcpServer::new(...)?