如何在 Rust Warp 回调中通过引用传递对象?
How to pass an object by reference inside Rust Warp callback?
我是 Rust 编程的新手,仍在努力理解有关内存和所有权的概念。
我有这个代码。
#[tokio::main]
async fn main() {
let file_root = String::from("test_dir/");
let content_dir = String::from("posts_");
let obj = msgnode::MsgNode::new(file_root.clone(), content_dir.clone());
let node_filter = warp::any().map(move || obj.clone());
// GET /hello/warp => 200 OK with body "Hello, warp!"
let hello = warp::get()
.and(warp::path("waservice"))
.and(warp::path::end())
.and(msg_body())
.and(node_filter.clone())
.and_then(store_wamsg);
warp::serve(hello)
.run(([127, 0, 0, 1], 3030))
.await;
}
mod msgnode;
一切都很好,除了我无法使用 MsgNode
对象的克隆实例。在 store_wamsg 中,我使用 MsgNode 对象如下:
async fn store_wamsg(item: MsgItem, node : &msgnode::MsgNode) -> Result<impl warp::Reply, warp::Rejection> {
let mut node2 = node.clone();
node2.create_file(item.msg_content);
Ok(warp::reply::with_status(
"All good",
http::StatusCode::OK,
))
}
我的问题是,是否有一种方法不需要在每次向服务发出新请求时都在 main 函数中使用 MsgNode 对象的多个克隆实例?
更准确地说,我想做这样的事情:
let node_filter = warp::any().map(move || &obj);
并以某种方式在 store_wamsg 函数中传递引用。现在,当我这样做时,我 运行 出现以下错误:
116 | let node_filter = warp::any().map(move || &obj);
| ------- ^^^^ returning this value requires that `'1` must outlive `'2`
| | |
| | return type of closure is &'2 MsgNode
| lifetime `'1` represents this closure's body
|
= note: closure implements `Fn`, so references to captured variables can't escape the closure
您可以在Arc
Mutex
中封装msgnode来同步访问:
use std::sync::{Arc, Mutex};
let obj = Arc::new(Mutex::new(msgnode::MsgNode::new(
file_root.clone(),
content_dir.clone(),
)));
let node_filter = warp::any().map(move || obj.clone());
此处,obj.clone()
克隆原子资源计数器,而不是 msgnode。因此只有一个 MsgNode 实例,线程在 Arc 和 Mutex 的帮助下协调它们对它的访问。
我是 Rust 编程的新手,仍在努力理解有关内存和所有权的概念。
我有这个代码。
#[tokio::main]
async fn main() {
let file_root = String::from("test_dir/");
let content_dir = String::from("posts_");
let obj = msgnode::MsgNode::new(file_root.clone(), content_dir.clone());
let node_filter = warp::any().map(move || obj.clone());
// GET /hello/warp => 200 OK with body "Hello, warp!"
let hello = warp::get()
.and(warp::path("waservice"))
.and(warp::path::end())
.and(msg_body())
.and(node_filter.clone())
.and_then(store_wamsg);
warp::serve(hello)
.run(([127, 0, 0, 1], 3030))
.await;
}
mod msgnode;
一切都很好,除了我无法使用 MsgNode
对象的克隆实例。在 store_wamsg 中,我使用 MsgNode 对象如下:
async fn store_wamsg(item: MsgItem, node : &msgnode::MsgNode) -> Result<impl warp::Reply, warp::Rejection> {
let mut node2 = node.clone();
node2.create_file(item.msg_content);
Ok(warp::reply::with_status(
"All good",
http::StatusCode::OK,
))
}
我的问题是,是否有一种方法不需要在每次向服务发出新请求时都在 main 函数中使用 MsgNode 对象的多个克隆实例?
更准确地说,我想做这样的事情:
let node_filter = warp::any().map(move || &obj);
并以某种方式在 store_wamsg 函数中传递引用。现在,当我这样做时,我 运行 出现以下错误:
116 | let node_filter = warp::any().map(move || &obj);
| ------- ^^^^ returning this value requires that `'1` must outlive `'2`
| | |
| | return type of closure is &'2 MsgNode
| lifetime `'1` represents this closure's body
|
= note: closure implements `Fn`, so references to captured variables can't escape the closure
您可以在Arc
Mutex
中封装msgnode来同步访问:
use std::sync::{Arc, Mutex};
let obj = Arc::new(Mutex::new(msgnode::MsgNode::new(
file_root.clone(),
content_dir.clone(),
)));
let node_filter = warp::any().map(move || obj.clone());
此处,obj.clone()
克隆原子资源计数器,而不是 msgnode。因此只有一个 MsgNode 实例,线程在 Arc 和 Mutex 的帮助下协调它们对它的访问。