Rust将枚举返回为通用类型

man

我试图创建一个包含节点集合的结构。为了限制类型,这些节点中的每个节点都可以保留枚举类型NodeVal的值。

然后,我可以将访问器函数添加到Container结构中,以获取和设置值。但是,get_node_f64, get_node_i64没有添加一个等,而是尝试制作一个接受实现的类型的泛型函数Num trait

这似乎不起作用,因为Node的val属性是NodeVal而不是T。但是,如果将其设为T,它将可以是任何类型,我想避免这种类型。

有什么方法可以实现我想做的,还是我在构造错误的方法呢?

use std::collections::HashMap;
use num_traits::Num;

pub enum NodeVal {
    Str(String),
    F64(f64),
    Uint64(u64),
    Int64(i64),
}

pub struct Node {
    id: i32,
    val: NodeVal
}

pub struct Container {
    nodes: HashMap<i32, Node>
}

impl Container {
    pub fn new() -> Self {
        Container {
            nodes: HashMap::new()
        }
    }

    pub fn get_node_str(&self, key: &i32) -> Option<String> {
        match self.nodes.get(key) {
            Some(r) => match &r.val {
                NodeVal::Str(x) => Some(x.to_string()),
                _ => None
            },
            None => None
        }
    }

    // Does not compile
    pub fn get_node_num<T: num_traits::Num>(&self, key: &i32) -> Option<T> {
        match self.nodes.get(key) {
            Some(r) => match &r.val {
                NodeVal::F64(x) | NodeVal::Uint64(x) | NodeVal::Int64(x) => Some(*x),
                _ => None
            },
            None => None
        }
    }
}
马斯林

这似乎不起作用,因为Node的val属性是NodeVal而不是T。但是,如果将其设为T,它将可以是任何类型,我想避免这种类型。

我得到的是它不起作用,因为x您要匹配的三个变体中的类型不同,这对Rust毫无意义,它抱怨xinF64是an f64xinUint64是anu64xinInt64i64,因此*的类型x没有意义。

您对特征范围的使用也是不正确的,特征范围是调用方指定类型的一种方法,但get_node_num一秒钟都不会考虑。

再加上推理是没有道理的:

但是,如果我将其设为T,它将可以是任何类型,但我想避免这种类型。

get_node_num确定返回类型是什么,T完全没有用。get_node_num也不能用,因为您不能在Rust中返回“ f64或u64或i64”,除非创建一个新的enum存储这些替代项的文件。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

枚举方法的通用返回类型

来自分类Dev

通用类枚举返回类型

来自分类Dev

枚举方法的通用返回类型

来自分类Dev

Rust无法为通用特征impl推断返回类型

来自分类Dev

将枚举类型从Rust转换为Java

来自分类Dev

将枚举类型从Rust转换为Java

来自分类Dev

确定类型是否为枚举类型的通用列表

来自分类Dev

通用枚举类型防护

来自分类Dev

如何在.NET Standard中为通用枚举类型设置枚举标志?

来自分类Dev

如何在.NET Standard中为通用枚举类型设置枚举标志?

来自分类Dev

JavaParser将通用类型添加为方法返回类型

来自分类Dev

声明通用方法返回枚举

来自分类Dev

当用作通用类型时,可为空的枚举类型不能分配为null

来自分类Dev

通用方法的通用返回类型

来自分类Dev

通用方法的通用返回类型

来自分类Dev

将枚举的生命周期指定为返回类型

来自分类Dev

通用返回类型

来自分类Dev

接口通用返回类型

来自分类Dev

为什么将通用返回类型强制转换为另一个通用类型?

来自分类Dev

从通用类型推断返回类型?

来自分类Dev

将字符串解析为通用类型

来自分类Dev

如何将std :: bind传递为通用引用类型?

来自分类Dev

使用Simple Injector将开放通用类型注册为后备

来自分类Dev

将字符串解析为通用类型

来自分类Dev

将Rust枚举转换为子枚举

来自分类Dev

将枚举转换为F#中的列表或序列或通用集合类型

来自分类Dev

C# 如何将通用类型的枚举作为变量传递给函数...?

来自分类Dev

用于将枚举转换为字符串并返回的通用函数

来自分类Dev

比较通用枚举和关联的类型