相关疑难解决方法(0)

为什么在包含闭包的选项中“一种类型比另一种更通用”?

我写了一些编译好的代码,然后我变成TOption<T>,现在我收到了这个错误:

error[E0308]: mismatched type...one type is more general than the other
Run Code Online (Sandbox Code Playgroud)

在构建最小案例时,我注意到如果我更改data: &strdata: 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)

有人可以帮助我了解这里发生了什么吗?

rust

14
推荐指数
1
解决办法
1915
查看次数

将通用函数作为参数传递

我希望能够将泛型函数传递给另一个函数(在本例中为闭包),而不会丢失传递函数的"泛型".由于这是一个非常复杂的陈述,这是一个例子:

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)

rust

8
推荐指数
2
解决办法
1694
查看次数

具有较高排名特征绑定参数的异步函数参数不起作用,一种类型比另一种类型更通用

我正在尝试将函数指针作为参数中的回调函数传递,这是迄今为止我的代码中的一个剥离示例:

Rust 游乐场代码

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)

type-inference higher-kinded-types rust async-await

5
推荐指数
1
解决办法
318
查看次数