【发布时间】:2023-04-01 09:40:02
【问题描述】:
我有 T 和 S 类型的交易列表,在运行时我想获取它的详细信息。 如何为结构提供多种泛型类型的特征 我试过的代码如下:-
use std::fmt::Debug;
use std::any::Any;
#[derive(Debug)]
struct TransactionSet<T,S>{
pub name: String,
pub key:T,
pub value:S
}
trait Details<T,S>{
fn get_details(&self);
fn get_key(&self)->&T;
fn get_value(&self)->&S;
}
impl<T: Debug, S: Debug> Details<T,S> for TransactionSet<T, S> {
fn get_details(&self) {
println!("{:?} {:?} {:?}",self.name.to_string(),&self.key,&self.value)
}
fn get_key(&self)->&T {
&self.key
}
fn get_value(&self)->&S {
&self.value
}
}
fn print_type_of<T>(_: &T) {
println!("{}", std::any::type_name::<T>())
}
fn get<T: Any>(value: Box<dyn Any>) -> T {
let pv = value.downcast().expect("The pointed-to value must be of type T");
*pv
}
fn main() {
//let mut vec: Vec<Box<dyn NewTrait<T:Debug,S:Debug>>> = Vec::new(); //Not working
// let mut vec: Vec<Box<dyn Details<T: Debug,S: Debug>>> = Vec::new();//Cannot use Details Trait
let vec: Vec<Box<dyn Details<_,_>>> = Vec::new();//Cannot use Details Trait
let a1:TransactionSet<String,String> = TransactionSet { name: String::from("Test1"), key: String::from("name"), value: String::from("vinay") };
let a2:TransactionSet<String,i32> = TransactionSet { name: String::from("Test2"), key: String::from("age"), value: 32_i32 };
let a3 = TransactionSet { name: String::from("Test3"), key: 1_i32, value: 10_u64 };
let a4 = TransactionSet { name: String::from("Test4"), key: String::from("isEligibleToVote"), value: true };
//let a2 = ABC::new( String::from("Test2"), String::from("company"), String::from("supra"));;
vec.push(Box::<TransactionSet<String,String>>::new(a1));
vec.push(Box::<TransactionSet<String,i32>>::new(a2));
vec.push(Box::new(a3));
vec.push(Box::new(a4));
for v in vec.iter() {
v.get_details();
// print_type_of(v);
println!("Key : {:?}", v.get_key());
println!("Value : {:?}", v.get_value());
}
}
有没有其他方法可以解决这个问题?
就像Vec<Box<dyn Details<?Unknown,?Unknown>>> 一样,如果我删除特征详细信息的泛型类型,我不能为它写 getter
【问题讨论】:
-
这本身是行不通的。您正在尝试混合类型。
-
@Netwave 我想拥有可以具有动态类型的 TransactionSet。我该怎么做?
-
没关系,但类型也需要装箱。
-
@Netwave 你能在操场上分享演示吗
-
@Netwave 你能分享一个 S 是 vec[S] 的操场链接吗
标签: rust dynamic-dispatch