Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 借来的价值不够活?_Rust_Hyper - Fatal编程技术网

Rust 借来的价值不够活?

Rust 借来的价值不够活?,rust,hyper,Rust,Hyper,这是本文的延续,提出了一个新的Q,以便更好的呈现 我用互斥锁制作了一个最小的main,但是现在test\u for\u closure的寿命不够长,并且在仍然借用的情况下被放在这里。真是一次旅行!:) 铁锈操场连接: 使用std:{convert::Infallible,net::SocketAddr}; 使用std::sync::{Arc,Mutex}; 使用hyper::{Body,Request,Response,Server,Version}; 使用hyper::{Method,Stat

这是本文的延续,提出了一个新的Q,以便更好的呈现

我用互斥锁制作了一个最小的
main
,但是现在
test\u for\u closure
寿命不够长
,并且
在仍然借用的情况下被放在这里。真是一次旅行!:)

铁锈操场连接:

使用std:{convert::Infallible,net::SocketAddr};
使用std::sync::{Arc,Mutex};
使用hyper::{Body,Request,Response,Server,Version};
使用hyper::{Method,StatusCode};
使用hyper::service::{make_service_fn,service_fn};
//使用东京::同步::互斥;
#[tokio::main]
使用std::{convert::infalleble,net::SocketAddr};
使用std::sync::{Arc,Mutex};
使用hyper::{Body,Request,Response,Server,Version};
使用hyper::service::{make_service_fn,service_fn};
#[tokio::main]
异步fn main()->结果{
让mut测试:Arc=Arc::new(Mutex::from(“Foo.”to_string());
让mut测试_,以确定_closure=Arc::clone(&test);
让addr=SocketAddr::from([127,0,0,1],4321));
设make_svc=make_service_fn(| | u conn | async{
Ok::(服务|请求|异步移动{
if req.version()==version::HTTP_11{
设foo=test_for_closure.lock().unwrap();
确定(响应::新建(主体::from(foo.as_str()))
}否则{
错误(“非HTTP/1.1,中止连接”)
}
}))
});
让server=server::bind(&addr).service(make_svc);
如果让Err(e)=server.wait{
eprintln!(“服务器错误:{}”,e);
}
好(())
}


考虑到我们最终需要修改Arc的值,但仍然需要
hyper
在HTTP响应上发回“当前”值,如何解决这个问题呢?

有两个问题,首先,
Body
只实现
FromWow,所以我仍然缺少很多东西。非常感谢您的解释!请将错误粘贴为包含三个反勾号的文本。IDE的屏幕截图不可搜索、不可编辑,并且对于不同字体大小的用户或手机用户来说可能很难阅读。
use std::sync::{Arc, Mutex};
use std::{convert::Infallible, net::SocketAddr};

use hyper::service::{make_service_fn, service_fn};
use hyper::{Body, Request, Response, Server, Version};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let test: Arc<Mutex<String>> = Arc::new(Mutex::from("Foo".to_string()));

    let addr = SocketAddr::from(([127, 0, 0, 1], 4321));

    let make_svc = make_service_fn(|_conn| {
        let test_for_closure = test.clone();
        let svc_fn = service_fn(move |req: Request<Body>| {
            let test_for_closure = test_for_closure.clone();
            async move {
                if req.version() == Version::HTTP_11 {
                    let foo = test_for_closure.lock().unwrap();
                    Ok(Response::new(Body::from(foo.clone())))
                } else {
                    Err("not HTTP/1.1, abort connection")
                }
            }
        });
        async move { Ok::<_, Infallible>(svc_fn) }
    });

    let server = Server::bind(&addr).serve(make_svc);

    // change the value at will:
    let mut guard = test.lock().unwrap();
    *guard = "Bar".into();
    drop(guard);

    if let Err(e) = server.await {
        eprintln!("server error: {}", e);
    }

    Ok(())
}