代码之家  ›  专栏  ›  技术社区  ›  McKayla

锈病中等式的比较函数

  •  0
  • McKayla  · 技术社区  · 7 年前

    fn pick_a_function(decider: u32) -> fn(&mut SomeStruct) {
        match decider {
            1 => add,
            2 => sub,
            _ => zero,
        }
    }
    
    fn add(x: &mut SomeStruct) {
        x.a += x.b;
    }
    
    fn sub(x: &mut SomeStruct) {
        x.a -= x.b;
    }
    
    fn zero(_x: &mut SomeStruct) {
        x.a = 0;
    }
    
    fn main() {
        let mut x = SomeStruct { a: 2, b: 3 };
        pick_a_function(1)(&mut x);
    
        println!("2 + 3 = {}", x.a);
    }
    
    #[cfg(test)]
    mod tests {
        use super::*;
    
        fn picks_correct_function() {
            assert_eq!(pick_a_function(1), add);
        }
    }
    

    问题是这些函数似乎没有实现 Eq PartialEq 性格,所以 assert_eq! 只是说它不能比较它们。我有什么选项可以比较返回的函数和正确的函数?

    1 回复  |  直到 7 年前
        1
  •  0
  •   user11667416 user11667416    7 年前

    您应该比较结果而不是函数,例如:

    #[cfg(test)]
    mod tests {
        use super::*;
    
        fn picks_correct_function() {
          let add_picked = pick_a_function(1);
          assert_eq!(add_picked(1,2), add(1,2));
        }
    }
    

    或者在更复杂的情况下,您可以比较输入,使一个函数接受一个参数,另一个函数接受两个参数,尝试调用其中任何一个,看看是否得到编译器错误。

        2
  •  0
  •   McKayla    7 年前

    PartialEq 只要不附加生存期,只要函数接受的参数少于10个。这种限制是因为每种形式的函数签名都必须直接实现特征,因为编译器认为它们都是完全不相关的类型。

    我返回的函数引用了一个结构的可变引用,该结构隐式地赋予函数一个生存期,因此它们不再具有实现 部分

    #[cfg(test)]
    mod tests {
        use super::*;
    
        fn picks_correct_function() {
            assert_eq!(
                pick_a_function(1) as usize,
                add as usize
            );
        }
    }
    
    推荐文章