回调几个变量修改

时间:2017-05-28 20:58:45

标签: rust

我有变量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变种。

因为不清楚,我想在更新任何参数时调用回调。例如,在上面的代码中,如果更新了f1T1类型的变量,则应调用T2。我有n个唯一变量,每个变量都有一个唯一类型,然后我将其放入Vec<Box<Any>>

0 个答案:

没有答案