Generics &引用;不明确的关联类型“;返回通用lambda时

Generics &引用;不明确的关联类型“;返回通用lambda时,generics,lambda,rust,Generics,Lambda,Rust,我有这个代码(人为的,纯实验性的) 我理解这是因为编译器无法根据我实现的各种特性确定T::Output的类型。有没有其他的方法来编写它呢?您需要输出类型相同的Add、Sub、Mul和Div。您可以通过添加另一个类型参数并将每个trait的输出约束为该类型参数来实现这一点 fn math_op_gen<T, R>(op: &str) -> Option<Box<Fn(T, T) -> R>> where T: std::ops::A

我有这个代码(人为的,纯实验性的)


我理解这是因为编译器无法根据我实现的各种特性确定T::Output的类型。有没有其他的方法来编写它呢?

您需要输出类型相同的
Add
Sub
Mul
Div
。您可以通过添加另一个类型参数并将每个trait的
输出
约束为该类型参数来实现这一点

fn math_op_gen<T, R>(op: &str) -> Option<Box<Fn(T, T) -> R>> 
    where T: std::ops::Add<Output=R> +
             std::ops::Sub<Output=R> +
             std::ops::Mul<Output=R> +
             std::ops::Div<Output=R> {
        let ret: Option<Box<Fn(T, T) -> R>> = match op {
            "+" => Some(Box::new(|a, b| { a + b } )),
            "-" => Some(Box::new(|a, b| { a - b } )),
            "*" => Some(Box::new(|a, b| { a * b } )),
            "/" => Some(Box::new(|a, b| { a / b } )),
            _ => None,
        };

        ret
}
fn数学运算生成(运算:&str)->Option>
其中T:std::ops::Add+
std::ops::Sub+
std::ops::Mul+
std::ops::Div{
让ret:Option>=匹配op{
“+”=>Some(Box::new(|a,b{a+b})),
“-”=>Some(Box::new(|a,b{a-b})),
“*”=>Some(Box::new(|a,b{a*b})),
“/”=>Some(Box::new(|a,b{a/b})),
_=>没有,
};
ret
}
let add: Option<Box<Fn(i32, i32) -> i32>> = math_op("+");
println!("Add {}", add.unwrap()(10, 2));
fn math_op_gen<T>(op: &str) -> Option<Box<Fn(T, T) -> T::Output>> 
    where T: std::ops::Add + std::ops::Sub + std::ops::Mul + std::ops::Div {
        let ret: Option<Box<Fn(T, T) -> T::Output>> = match op {
            "+" => Some(Box::new(|a, b| { a + b } )),
            "-" => Some(Box::new(|a, b| { a - b } )),
            "*" => Some(Box::new(|a, b| { a * b } )),
            "/" => Some(Box::new(|a, b| { a / b } )),
            _ => None,
        };

        ret
}
error: ambiguous associated type `Output` in bounds of `T` [E0221]
note: associated type `T` could derive from `core::ops::Div`
note: associated type `T` could derive from `core::ops::Mul`
note: associated type `T` could derive from `core::ops::Sub`
note: associated type `T` could derive from `core::ops::Add`
fn math_op_gen<T, R>(op: &str) -> Option<Box<Fn(T, T) -> R>> 
    where T: std::ops::Add<Output=R> +
             std::ops::Sub<Output=R> +
             std::ops::Mul<Output=R> +
             std::ops::Div<Output=R> {
        let ret: Option<Box<Fn(T, T) -> R>> = match op {
            "+" => Some(Box::new(|a, b| { a + b } )),
            "-" => Some(Box::new(|a, b| { a - b } )),
            "*" => Some(Box::new(|a, b| { a * b } )),
            "/" => Some(Box::new(|a, b| { a / b } )),
            _ => None,
        };

        ret
}