Function 如何在泛型函数中构造具体类型?

Function 如何在泛型函数中构造具体类型?,function,generics,rust,traits,Function,Generics,Rust,Traits,我需要用什么替换/*type*/以便o_f可以等于None、Somea、Someb或Some/*具有相同签名的不同函数*/ 你想做的是不可能的。您在T上有一个泛型函数,但在内部您尝试使用具体类型i32。Rust单态根据调用泛型函数的类型来划分泛型函数。以这个项目为例: fn函数F:F,t:t 其中F:FnT { 英尺; } 结构; 结构R; fn干线{ func | x |{},S; func | x |{},R; } 将被编译为如下内容: fn func_Sf:impl FnS,s:s { 财

我需要用什么替换/*type*/以便o_f可以等于None、Somea、Someb或Some/*具有相同签名的不同函数*/


你想做的是不可能的。您在T上有一个泛型函数,但在内部您尝试使用具体类型i32。Rust单态根据调用泛型函数的类型来划分泛型函数。以这个项目为例:

fn函数F:F,t:t 其中F:FnT { 英尺; } 结构; 结构R; fn干线{ func | x |{},S; func | x |{},R; } 将被编译为如下内容:

fn func_Sf:impl FnS,s:s { 财政司司长; } fn func_Rf:impl FnR,r:r { fr; } 结构; 结构R; fn干线{ func|S|S{},S; func|R|R{},R; } 这一切都很好,但是如果我们回去,把第一个函数改成这个函数,这基本上就是你要做的:

fn函数F:F,t:t 其中F:FnT { 英尺; f1;//混凝土类型i32,而不是类型T } 结构; 结构R; fn干线{ func | x |{},S; func | x |{},R; } 现在它不会编译,但如果我们想象它会编译,那么它会像这样:

fn func_Sf:impl FnS,s:s { 财政司司长; f1;//错误!f期望S不是i32 } fn func_Rf:impl FnR,r:r { fr; f1;//错误!f要求R不是i32 } 结构; 结构R; fn干线{ func|S|S{},S; func|R|R{},R; } 你知道这完全没有道理吗?您试图将i32传递给期望S和R的函数

现在,你有两个选择。如果您只需要i32s的数据结构,那么不需要将其设置为泛型,只需为i32s定义即可。如果您想要一个通用结构,其中,如果缺少某个节点,并且您想要用默认节点填充它(可能在节点的情况下,默认节点是node::new1),那么您可以在默认情况下绑定T并编写如下内容:

[衍生默认值] 结构节点; [衍生默认值] 结构; [衍生默认值] 结构R; fn函数F:F,t:Option 其中T:Default,F:FnNode { ft.unwrap_或默认值; } fn干线{ func | x |{},一些节点; func | x |{},SomeNodeR; func | x:Node |{},无; } 现在,您的函数是T上真正的泛型函数,并处理包括Node在内的所有节点的情况

另见


Option bool>@Jmb Option bool>如果不用于调用f&mut o_b_n_num,那么Option bool>@Jmb确实是正确的,因为1不是类型T。那么Option bool>@Jmb我的意思是:是否有一种方法可以注释f,以便在不同的位置,可以在不同选项类型的值上调用它,只要这些类型满足a和b签名中描述的Copy+Ord约束?否,一个变量只能有一个类型。但是,您可以重新定义变量,以便在需要其他类型时添加新的let o_f=。
fn func<T: Copy + Ord>(x: &mut Option<Box<Node<T>>>)
{
    let mut o_f: /* type */ = None;
    let mut result_of_f: Option<bool> = None;
    let mut o_b_n_num = Some(Box::new(Node::new(1)));

    // ...

    if let Some(f) = o_f
    {
        result_of_f = Some(f(x) && f(&mut o_b_n_num));
    }

    // ...
}