我有一个函数,它以数字作为参数,然后返回基于该数字的函数。根据许多不同的事情,它可能会返回其中任何一个约50个函数,并且决定要返回哪个函数的情况变得非常复杂。因此,我想构建一些测试来确保返回正确的函数。到目前为止,我的代码大致如下。
问题是这些函数似乎没有实现
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!
只会提示无法比较它们。我有哪些选项可以将返回的函数与正确的函数进行比较?
println!("{}", pick_a_function(1) == add);
。你是否使用旧的rustc(如果是,则可能需要将其转换为usize)? - Denys SéguretPartialEq
,但只有当它们没有附加到生命周期时才会这样。它们所有的参数都是可变结构体引用,这会隐式地将生命周期附加到函数上,从而防止它们成为PartialEq
。将函数强制转换为 usize 似乎可以解决这个问题。 - McKayla