【发布时间】:2019-03-03 12:47:20
【问题描述】:
我有一个与枚举一起使用二进制函数的函数。这是给口译员的:
use std::ops::*;
#[derive(Debug, Clone, PartialEq, PartialOrd)]
pub enum Scalar {
I64(i64),
I32(i32),
//many many others
}
pub trait TMath: Add + Mul + Sized {} //mark numerical types
impl<T: Add + Mul> TMath for T {}
fn add<T: TMath>(x: T, y: T) -> <T as Add>::Output {
x + y
}
pub type NatBinExpr<T: TMath> = Fn(&T, &T) -> T;
我想做:
let result = bin_op(add, &Scalar::I32(1), &Scalar::I32(2));
还要让它适用于任意二进制函数:
let result = bin_op(Scalar::concat, &Scalar::I32(1), &Scalar::I32(2));
但是,我还没有找到一种方法来通过闭包而不使bin_op 泛型:
fn bin_op(apply: &NatBinExpr???, x: &Scalar, y: &Scalar) -> Scalar {
match (x, y) {
(Scalar::I64(a), Scalar::I64(b)) => Scalar::I64(apply(a, b)),
(Scalar::I32(a), Scalar::I32(b)) => Scalar::I32(apply(a, b)),
}
}
使bin_op 泛型是不对的; bin_op 对Scalar 进行操作,但内部操作是通用的。
【问题讨论】:
-
看起来你需要更高种类的类型来表达这一点,目前 rust 不支持。