我有变量v1
,...,vn
,每个变量都有唯一的类型T1
,...,Tn
。我希望能够订阅修改
这些变量中,一次不超过4个。
use std::any::Any;
#[derive(Debug)]
struct T1(f32);
#[derive(Debug)]
struct T2(f32);
fn f1(a: &T1, b: &T2) {
println!("you call f1: a {:?} b {:?}", a, b);
}
fn main() {
let mut p1: Box<Any> = Box::new(T1(0.1));
let mut p2: Box<Any> = Box::new(T2(0.1));
let mut v = vec![p1, p2];
let mut callbacks = ???
subscribe_on_change(&mut callbacks, T1_id, T2_id, f1);
if let Some(num) = v[0].downcast_mut::<T1>() {
println!("num: {:?}", num);
*num = T1(5.1);
callbacks.update(T1_id);
}
}
如何仅使用stable或beta编译器来实现此类功能?
因为std::any::Any::get_type_id
仅在夜间编译器中可用,所以我可以使用我的特征扩展Any
,并将TypeId
替换为我自己的enum
,如果没有更多优雅的解决方案。
但如果我想要调用函数,我会将callbacks
放入什么
签名:(&Tk1)
,(&Tk1, &Tk2)
,(&Tk1, &Tk2, &Tk3)
,
(&Tk1, &Tk2, &Tk3, &Tk4)
,我至少有10种类型,
因为每个ki!= kj,我有10 + 10 * 9 + 10 * 9 * 8 + 10 * 9 * 8 * 7变种。
因为不清楚,我想在更新任何参数时调用回调。例如,在上面的代码中,如果更新了f1
或T1
类型的变量,则应调用T2
。我有n
个唯一变量,每个变量都有一个唯一类型,然后我将其放入Vec<Box<Any>>
。