Generics 使用具体类型调用泛型闭包
是否可以使用具体类型和具体结构调用泛型函数 下面是我想做的一个小例子:Generics 使用具体类型调用泛型闭包,generics,rust,traits,generic-function,Generics,Rust,Traits,Generic Function,是否可以使用具体类型和具体结构调用泛型函数 下面是我想做的一个小例子: trait T {} trait T2 {} struct S1 {} struct S2 {} impl T for S1 {} impl T for S2 {} fn test<V: T>(foo: &S1, bar: &S2, f: &Fn(&V)) { f::<S1>(foo); f(bar); } fn main() { test(
trait T {}
trait T2 {}
struct S1 {}
struct S2 {}
impl T for S1 {}
impl T for S2 {}
fn test<V: T>(foo: &S1, bar: &S2, f: &Fn(&V)) {
f::<S1>(foo);
f(bar);
}
fn main() {
test(&S1{}, &S2{}, &|_| println!("called"));
}
trait T{}
性状T2{}
结构S1{}
结构S2{}
S1{}的impl T
S2{}的impl T
fn测试(foo:&S1,bar:&S2,f:&fn&V)){
f:(foo);
f(巴);
}
fn main(){
测试(&S1{},&S2{},&| | | println!(“被调用”);
}
我无法摆脱泛型参数
V
,因为我要解决的实际问题要复杂得多。此外,我无法创建包装特征,因为有时我的签名很弱,有时f
需要更多的特征。这可能不是您想要的,但它可以工作:
trait T {}
trait T2 {}
struct S1 {}
struct S2 {}
impl T for S1 {}
impl T for S2 {}
fn test<F>(foo: &S1, bar: &S2, f: F)
where F: Fn (&T)
{
f(foo as &T);
f(bar as &T);
}
fn main() {
test(&S1{}, &S2{}, |_| println!("called"));
}
trait T{}
性状T2{}
结构S1{}
结构S2{}
S1{}的impl T
S2{}的impl T
fn测试(foo:&S1,bar:&S2,f:f)
式中F:Fn和T
{
f(foo as&T);;
f(钢筋混凝土和钢筋混凝土);
}
fn main(){
测试(&S1{},&S2{},| | | println!(“被调用”);
}
这将导致foo和bar被强制转换为Trait对象,这意味着它将携带vtable指针(可能不需要)。它使F成为多态调用
如果没有关于您的类型的更多信息,就很难理解您想要做什么。这可能不是您想要的,但它可以工作:
trait T {}
trait T2 {}
struct S1 {}
struct S2 {}
impl T for S1 {}
impl T for S2 {}
fn test<F>(foo: &S1, bar: &S2, f: F)
where F: Fn (&T)
{
f(foo as &T);
f(bar as &T);
}
fn main() {
test(&S1{}, &S2{}, |_| println!("called"));
}
trait T{}
性状T2{}
结构S1{}
结构S2{}
S1{}的impl T
S2{}的impl T
fn测试(foo:&S1,bar:&S2,f:f)
式中F:Fn和T
{
f(foo as&T);;
f(钢筋混凝土和钢筋混凝土);
}
fn main(){
测试(&S1{},&S2{},| | | println!(“被调用”);
}
这将导致foo和bar被强制转换为Trait对象,这意味着它将携带vtable指针(可能不需要)。它使F成为多态调用
如果没有关于您的类型的更多信息,就很难理解您想要做什么。这是不可能的:
fn test<V: T>(foo: &S1, bar: &S2, f: &Fn(&V)) {
f::<S1>(foo);
}
但你已经排除了这个可能性,所以
顺便说一句,我不知道你为什么要把闭包作为一个trait对象。通常,我只接受一个通用的:
fn test<F>(foo: &S1, bar: &S2, f: F)
where F: Fn(&T),
fn测试(foo:&S1,bar:&S2,f:f)
式中F:Fn和T,
这允许某种程度的单晶化发生。这是不可能的:
fn test<V: T>(foo: &S1, bar: &S2, f: &Fn(&V)) {
f::<S1>(foo);
}
但你已经排除了这个可能性,所以
顺便说一句,我不知道你为什么要把闭包作为一个trait对象。通常,我只接受一个通用的:
fn test<F>(foo: &S1, bar: &S2, f: F)
where F: Fn(&T),
fn测试(foo:&S1,bar:&S2,f:f)
式中F:Fn和T,
这允许某种程度的单晶化发生。注意,每次调用
test
时,都可以将V
实例化为一种类型。您想将V
的通用量化移动到Fn
。不幸的是,这不可能直接实现。也许这不能解决我的问题,因为我想传入几个不同的函数。一个特性也帮不上忙,因为泛型必须在一个方法上指定。所以我不能把它变成一个物体。。。在这种情况下,没有办法避免单态化吗?请注意,每次调用test
,都可以将V
实例化为一种类型。您想将V
的通用量化移动到Fn
。不幸的是,这不可能直接实现。也许这不能解决我的问题,因为我想传入几个不同的函数。一个特性也帮不上忙,因为泛型必须在一个方法上指定。所以我不能把它变成一个物体。。。在这种情况下,没有办法避免单晶化吗?我也这么认为,只是想确定一下。它需要是一个trait对象,因为我需要将这个闭包的大小设置为大小
@Cooki3Tubef
将在我显示的最后一个代码块中设置为大小
(否则它不能是参数!);所以我一定是误会你了。我一个小时前试过这个,编译器抱怨。。。现在我又试了一次,编译器不再抱怨了。奇怪,你有什么建议我怎么做?我只需要给出一些逻辑,作为一个可以在S1和S1上运行的colsureS2@Cooki3Tube你得把你的问题再详细一点。两个答案中的代码都显示使用S1
和S2
调用闭包。我也这么认为,只是想确定一下。它需要是一个trait对象,因为我需要将这个闭包的大小设置为大小
@Cooki3Tubef
将在我显示的最后一个代码块中设置为大小
(否则它不能是参数!);所以我一定是误会你了。我一个小时前试过这个,编译器抱怨。。。现在我又试了一次,编译器不再抱怨了。奇怪,你有什么建议我怎么做?我只需要给出一些逻辑,作为一个可以在S1和S1上运行的colsureS2@Cooki3Tube你得把你的问题再详细一点。两个答案中的代码都显示使用S1
和S2
调用闭包。