在类型别名上调用静态方法

最大限度

在使用盒装闭合时,我遇到了以下问题:

type Test = Rc<dyn Fn() -> i64>;

fn test_bad() -> Test {
    Test::new(|| 42)
}

fn test_good() -> Test {
    Rc::new(|| 42)
}

在第一种情况下,我使用类型别名来引用该new方法,而Rc在第二种情况下直接使用

在第一种情况下,编译器抱怨:

    |       Test::new(|| 42)
    |             ^^^ function or associated item not found in `Rc<(dyn Fn() -> i64 + 'static)>`
    |
    = note: the method `new` exists but the following trait bounds were not satisfied:
            `dyn Fn() -> i64: Sized`

但是第二种情况很好。有人可以解释一下区别吗?有什么方法可以new通过类型别名进行引用,还是需要自己包装呢?

Aplet123

test_good通过调用Rc::new|| 42,你创建一个Rc<dyn Fn() -> i64>,而是一个Rc<ClosureType>,这里ClosureType唯一的类型提供的封闭的,它大小。然后,由于在Rc<ClosureType>返回的函数中返回Rc<dyn Fn() -> i64>,因此其隐式转换为特征对象。

test_bad之所以失败,是因为它试图直接构造一个未定型特征对象的an 而不是从构造Rc一个大小闭合的闭包然后将其转换为一个未定大小的特征对象,这会失败,因为必须对函数的所有参数定大小。RcRc

我不认为有直接的方式可以new通过类型别名进行引用,尽管您可以很轻松地创建自己的别名:

fn new_test(func: impl 'static + Fn() -> i64) -> Test {
    Rc::new(func)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章