我有一个函数,它接受一个数字作为参数,然后根据该数字返回一个函数。根据许多不同的情况,它可能会返回约 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
or PartialEq
的特质,所以assert_eq!
只是说它无法比较它们。我有哪些选项可以将返回的函数与正确的函数进行比较?
所以 Rust 中的函数实际上确实实现了PartialEq
只要没有附加生命周期,并且函数接受的参数少于 10 个。这个限制是因为每种形式的函数签名都必须直接实现特征,因为编译器认为它们都是完全不相关的类型。
我返回的函数采用了对结构的可变引用,这隐式地赋予了函数一个生命周期,因此它们不再具有实现的类型签名PartialEq
。 rust 真正在内部所做的就是比较函数相等性,尽管将它们都转换为指针然后进行比较,所以我们实际上可以做同样的事情。
#[cfg(test)]
mod tests {
use super::*;
fn picks_correct_function() {
assert_eq!(
pick_a_function(1) as usize,
add as usize
);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)