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

标签 types rust closures type-alias trait-objects

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

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通过类型别名还是我需要自己包装?

最佳答案

test_good , 调用 Rc::new|| 42 ,您不要创建 Rc<dyn Fn() -> i64> , 但是一个 Rc<ClosureType> , 其中 ClosureTypeunique type of the closure provided ,并且它大小的。那么,由于 Rc<ClosureType>在返回 Rc<dyn Fn() -> i64> 的函数中返回, 它隐式地将其转换为特征对象。

test_bad失败,因为不是从构造 Rc 开始一个大小的封闭,然后将其转换为 Rc对于一个未确定大小的 trait 对象,它会尝试直接构造一个 Rc一个未调整大小的 trait 对象,由于函数的所有参数都必须调整大小,因此失败。

我认为没有直接的方法可以引用 new通过类型别名,尽管您可以很容易地创建自己的别名:

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

关于types - 在类型别名上调用静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66195446/

相关文章:

rust - 如何在Actix-web中获得请求主体作为Json的同时获得cookie?

closures - 如何将捕获的变量移动到闭包内的闭包中?

JavaScript 闭包函数传递给事件监听器

types - 在 Julia 的方法中传播类型参数

c++ - 标量类型是否包括类类型的指针?

python - Cython 扩展类型是否支持类属性?

rust - 这个 "atomic"Rust 代码和对应的 "non-atomic"代码有什么区别?

rust - 如何反序列化 Actix Actor 中的消息?

c++ - 如何在 C++ 中将类类型映射到该类的实例?

javascript - 我写了一个简单的 Javascript 关闭代码,但它没有运行。我哪里错了?