我写了一些编译好的代码,然后我变成T了Option<T>,现在我收到了这个错误:
error[E0308]: mismatched type...one type is more general than the other
Run Code Online (Sandbox Code Playgroud)
在构建最小案例时,我注意到如果我更改data: &str为data: String代码再次编译正常。
pub trait Subscriber {
fn recv(&mut self, data: &str);
}
pub struct Task<T>(pub Option<T>)
where
T: Fn(&str);
impl<T> Subscriber for Task<T>
where
T: Fn(&str),
{
fn recv(&mut self, data: &str) {
self.0.take().unwrap()(data)
}
}
fn main() {
Task(Some(|_| ()));
}
Run Code Online (Sandbox Code Playgroud)
有人可以帮助我了解这里发生了什么吗?
我希望能够将泛型函数传递给另一个函数(在本例中为闭包),而不会丢失传递函数的"泛型".由于这是一个非常复杂的陈述,这是一个例子:
use std::fmt::Debug;
fn test<F, I: Debug>(gen: F) where F: Fn(fn(I) -> I) -> I {
fn input<I: Debug>(x: I) -> I {
x
}
println!("{:?}", gen(input));
}
fn main() {
test(|input| {
input(10);
input(10.0)
});
}
Run Code Online (Sandbox Code Playgroud)
这将无法编译,因为值的input类型是推断的,不再是通用的.
完整错误:
<anon>:14:15: 14:19 error: mismatched types:
expected `_`,
found `_`
(expected integral variable,
found floating-point variable) [E0308]
<anon>:14 input(10.0)
^~~~
Run Code Online (Sandbox Code Playgroud)
生锈有可能吗?
编辑:
基于给出的解决方案,我使用以下方法来解决类似的问题:
#![feature(unboxed_closures)]
#![feature(fn_traits)]
use std::ops::Fn;
use std::ops::Add;
use std::ops::FnMut;
use std::fmt::Debug;
struct Builder;
impl Builder {
pub fn …Run Code Online (Sandbox Code Playgroud) 我正在尝试将函数指针作为参数中的回调函数传递,这是迄今为止我的代码中的一个剥离示例:
use std::{
fs::File,
io::{self, BufRead, BufReader},
path::Path,
};
use futures::{executor, Future}; // 0.3.8
type DigestCallback<R> = fn(&[u8]) -> R;
async fn consume<T>(
path: T,
chunk_size: usize,
digest: DigestCallback<impl Future<Output = ()>>,
) -> io::Result<()>
where
T: AsRef<Path>,
{
let file = File::open(path)?;
let mut reader = BufReader::with_capacity(chunk_size, file);
loop {
let buffer = reader.fill_buf()?;
let length = buffer.len();
if length == 0 {
break;
}
digest(buffer).await;
reader.consume(length);
}
Ok(())
}
async fn digest_callback(chunk: &[u8]) -> () { …Run Code Online (Sandbox Code Playgroud)