我试图创建一个包含节点集合的结构。为了限制类型,这些节点中的每个节点都可以保留枚举类型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毫无意义,它抱怨x
inF64
是an f64
,x
inUint64
是anu64
和x
inInt64
是i64
,因此*的类型x
没有意义。
您对特征范围的使用也是不正确的,特征范围是调用方指定类型的一种方法,但get_node_num
一秒钟都不会考虑。
再加上推理是没有道理的:
但是,如果我将其设为T,它将可以是任何类型,但我想避免这种类型。
get_node_num
确定返回类型是什么,T
完全没有用。get_node_num
也不能用,因为您不能在Rust中返回“ f64或u64或i64”,除非创建一个新的enum
存储这些替代项的文件。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句