Types 对类型别名调用静态方法

Types 对类型别名调用静态方法,types,rust,closures,type-alias,trait-objects,Types,Rust,Closures,Type Alias,Trait Objects,在使用盒式闭包时,我遇到了以下问题: 型式试验=Rc i64>; fn测试\u坏()->测试{ 测试:新的(| | 42) } fn测试良好()->测试{ Rc::新(| | 42) } 在第一种情况下,我使用类型别名来引用new方法,而在第二种情况下,我直接使用Rc 在第一种情况下,编译器会抱怨: |测试::新建(|| 42) |^^^^在“Rc i64+”静态中找不到函数或关联项)>` | =注意:方法“new”存在,但未满足以下特征界限: `dyn Fn()->i64:大小` 但第二种

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

型式试验=Rc i64>;
fn测试\u坏()->测试{
测试:新的(| | 42)
}
fn测试良好()->测试{
Rc::新(| | 42)
}
在第一种情况下,我使用类型别名来引用
new
方法,而在第二种情况下,我直接使用
Rc

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

|测试::新建(|| 42)
|^^^^在“Rc i64+”静态中找不到函数或关联项)>`
|
=注意:方法“new”存在,但未满足以下特征界限:
`dyn Fn()->i64:大小`

但第二种情况效果很好。有人能解释一下区别吗?有没有办法通过类型别名引用
new
,或者我需要自己包装它?

test\u good
中,通过调用
Rc::new
on
|124; 124; 42
,你不创建
Rc i64>
,而是创建一个
Rc
,其中
ClosureType
是最大的,它的大小是。然后,由于
Rc
在返回
Rc i64>
的函数中返回,因此它隐式地将其强制转换为trait对象

test\u bad
失败,因为它不是从构造大小闭包的
Rc
,然后将其转换为未大小特征对象的
Rc
,而是尝试直接构造未大小特征对象的
Rc
,这失败了,因为函数的所有参数都必须大小

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

fn新测试(func:impl'static+fn()->i64)->test{
Rc::新建(func)
}

泛型类型别名有效,但具体类型别名无效:

使用std::rc::rc;
MyGenericRc类型=Rc;
//工作
fn使用\u通用\u别名()构造\u->MyGenericRc i64>{
MyGenericRc::新建(| | 42)
}
类型MyConcreteRc=Rc i64>;
//失败
fn用混凝土构造混凝土别名()->MyConcreteRc{
MyConcretec::新建(| | 42)
}
调用
mygenerirc::new()
时,编译器选择
Rc:::new()
作为要使用的具体函数实现,因为
Rc::new
需要一个
size
参数,并且每个匿名闭包类型的大小都是
size
。但是,在调用该函数后,编译器将执行非大小强制,以将返回的
Rc
转换为
Rc i64>


当您调用
MyConcreteRc::new()
时,您不会让编译器决定要使用哪个
Rc::new
实现,而是告诉它必须使用
Rc::i64>::new
但不可能满足该实现的类型要求,因为
new
需要一个
大小的
参数,但
dyn Fn()->i64
!大小
,因此您会看到编译错误消息。

谢谢,这正是我想要的。可能也会有帮助。