微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Rust 显示预期的特征对象“dyn Future”,在将函数作为参数传递时发现不透明类型

如何解决Rust 显示预期的特征对象“dyn Future”,在将函数作为参数传递时发现不透明类型

df = df[df.ne('Bad Input').all(axis=1)]

我正在尝试创建一个模块,我需要在其中将异步函数作为参数传递。我已经通过了元素,但我无法从错误消息中推断出我应该做什么。它告诉我类型推断存在一些不匹配。

这是我收到的错误消息 use std::io::prelude::*; use std::net::TcpListener; use std::net::Tcpstream; use std::time::Duration; // pyO3 module use pyo3::prelude::*; use pyo3::wrap_pyfunction; use std::future::Future; #[pyfunction] pub fn start_server() { let listener = TcpListener::bind("127.0.0.1:7878").unwrap(); let pool = ThreadPool::new(4); for stream in listener.incoming() { let stream = stream.unwrap(); pool.execute(|| { let rt = tokio::runtime::Runtime::new().unwrap(); handle_connection(stream,rt,&test_helper); }); } } #[pymodule] pub fn roadrunner(_: Python<'_>,m: &PyModule) -> PyResult<()> { m.add_wrapped(wrap_pyfunction!(start_server))?; Ok(()) } async fn read_file(filename: String) -> String { let con = tokio::fs::read_to_string(filename).await; con.unwrap() } async fn test_helper(contents: &mut String,filename: String) { // this function will accept custom function and return *contents = tokio::task::spawn(read_file(filename.clone())) .await .unwrap(); } pub fn handle_connection( mut stream: Tcpstream,runtime: tokio::runtime::Runtime,test: &dyn Fn(&mut String,String) -> (dyn Future<Output = ()> + 'static),) { let mut buffer = [0; 1024]; stream.read(&mut buffer).unwrap(); let get = b"GET / HTTP/1.1\r\n"; let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line,filename) = if buffer.starts_with(get) { ("HTTP/1.1 200 OK","hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); ("HTTP/1.1 200 OK","hello.html") } else { ("HTTP/1.1 404 NOT FOUND","404.html") }; let mut contents = String::new(); let future = test_helper(&mut contents,String::from(filename)); runtime.block_on(future); let response = format!( "{}\r\nContent-Length: {}\r\n\r\n{}",status_line,contents.len(),contents ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); }

cargo check

请告诉我应该在此处进行哪些更改。提前致谢。

解决方法

您正在编写一个返回 dyn 类型的函数类型,不是对它的引用,而是未调整大小的类型本身,这是不可能的。每次你想写这样的东西时,尝试使用泛型:

pub fn handle_connection<F>(
    mut stream: TcpStream,runtime: tokio::runtime::Runtime,test: &dyn Fn(&mut String,String) -> F,)
where F: Future<Output = ()> + 'static

现在由于这个奇怪的错误而失败:

error[E0308]: mismatched types
  --> src/lib.rs:19:43
   |
19 |             handle_connection(stream,rt,&test_helper);
   |                                           ^^^^^^^^^^^^ one type is more general than the other
   |
   = note: expected associated type `<for<'_> fn(&mut String,String) -> impl Future {test_helper} as FnOnce<(&mut String,String)>>::Output`
              found associated type `<for<'_> fn(&mut String,String)>>::Output`

但这也是意料之中的,您的未来持有对您正在传递的 &mut String 的引用,因此它不再是 'static。解决方案只是添加一个生命周期通用参数:

pub fn handle_connection<'a,F>(
    mut stream: TcpStream,test: &dyn Fn(&'a mut String,)
where F: Future<Output = ()> + 'a

现在它应该可以编译了。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。