types - 在类型别名上调用静态方法
问题描述
在使用盒装闭包时,我遇到了以下问题:
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
on || 42
,您不会创建一个Rc<dyn Fn() -> i64>
,而是创建一个Rc<ClosureType>
,其中提供的闭包ClosureType
的唯一类型是,它是大小的。然后,由于在Rc<ClosureType>
返回的函数中返回Rc<dyn Fn() -> i64>
,因此它隐式地将其强制转换为特征对象。
test_bad
失败是因为它没有从构造Rc
一个大小的闭包然后将其转换为一个大小不一Rc
的特征对象,而是尝试直接构造一个Rc
大小不一的特征对象,这失败了,因为函数的所有参数都必须调整大小。
我认为没有直接的方法可以new
通过类型别名进行引用,尽管您可以很容易地制作自己的:
fn new_test(func: impl 'static + Fn() -> i64) -> Test {
Rc::new(func)
}
推荐阅读
- azure-devops - 报告:Azure DevOps Pipelines
- postgresql - PostgreSQL 从日期变量中提取年份
- iframe - 如何在 keycloak 的 iframe 中打开管理帐户页面
- java - 在 Java 中创建监听器
- javascript - 使用 Context API 时访问全局状态
- django-cms - 如何从 DjangoCMS 菜单中排除未发布的页面?
- java - 无法自动接线。找不到“AuthenticationProvider”类型的 bean
- javascript - 根据数组中的值将数据从一个数组添加到另一个数组的最佳方法是什么?
- java - 如何在Java中根据开始和结束文本分割文本
- java - PMD 问题为空指针异常