在使用盒装闭包时,我遇到了以下问题:
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>
, 其中 ClosureType
是 unique 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/