Я сделал примерную реализацию для добавления (я сделал некоторые предположения относительно типа возврата execute
и другие, вам придется адаптировать это, если мои предположения неверны):
use std::ops::Add;
#[derive(Debug)]
pub enum Bit { Off, On }
#[derive(Debug)]
pub struct Binary([Bit; 32]);
impl Binary {
fn to_int(&self) -> i64 {unimplemented!()}
fn from_int(n: i64) -> Self {unimplemented!()}
}
impl<'a, 'b> Add<&'b Binary> for &'a Binary {
type Output = Binary;
fn add(self, other: &'b Binary) -> Binary {
unimplemented!()
}
}
pub fn add(x: i64, y: i64) -> i64 {
execute(|a, b| a+b, x, y)
}
fn execute(f: fn(&Binary, &Binary) -> Binary, x: i64, y: i64) -> i64 {
let bx = Binary::from_int(x);
println!("{:?}\n{}\n", bx, x);
let by = Binary::from_int(y);
println!("{:?}\n{}\n", by, y);
let result = f(&bx, &by);
println!("{:?}", result);
result.to_int()
}
Обратите внимание, что в пределах execute
вам нужно будет позвонить f(&bx, &by)
(т.е. одолжить их вместо того, чтобы потреблять).
Однако: я удивился, почему вы выбрали fn(&Binary, &Binary) -> Binary
в качестве типа аргумента вместо того, чтобы сделать execute
универсальным для F
, ограничив F
быть вызываемым:
fn execute<F>(f: F, x: i64, y: i64) -> i64
where
F: Fn(&Binary, &Binary) -> Binary,
{
let bx = Binary::from_int(x);
println!("{:?}\n{}\n", bx, x);
let by = Binary::from_int(y);
println!("{:?}\n{}\n", by, y);
let result = f(&bx, &by);
println!("{:?}", result);
result.to_int()
}
Таким образом, вы немного более гибки (например, вы можете передавать замыкания, захватив переменные в их области видимости).