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对象,因为我需要将这个闭包的大小设置为
大小
@Cooki3Tube
f
将在我显示的最后一个代码块中设置为
大小
(否则它不能是参数!);所以我一定是误会你了。我一个小时前试过这个,编译器抱怨。。。现在我又试了一次,编译器不再抱怨了。奇怪,你有什么建议我怎么做?我只需要给出一些逻辑,作为一个可以在S1和S1上运行的colsureS2@Cooki3Tube你得把你的问题再详细一点。两个答案中的代码都显示使用
S1
S2
调用闭包。我也这么认为,只是想确定一下。它需要是一个trait对象,因为我需要将这个闭包的大小设置为
大小
@Cooki3Tube
f
将在我显示的最后一个代码块中设置为
大小
(否则它不能是参数!);所以我一定是误会你了。我一个小时前试过这个,编译器抱怨。。。现在我又试了一次,编译器不再抱怨了。奇怪,你有什么建议我怎么做?我只需要给出一些逻辑,作为一个可以在S1和S1上运行的colsureS2@Cooki3Tube你得把你的问题再详细一点。两个答案中的代码都显示使用
S1
S2
调用闭包。