【发布时间】:2020-03-05 20:03:03
【问题描述】:
我正在使用 rust_decimal crate 制作应用程序。我的应用程序的一部分涉及值 '1' 是操作数的操作,因此我尝试使用 num_traits::identities::one() 并遇到了一些意外错误:
use rust_decimal::Decimal;
use num_traits::identities::*;
fn foo(val : Decimal) {
let _1 = one(); // E0282, expected
let _one : Decimal = one(); // Ok, expected
let add : Decimal = one() + val; // E0283, unexpected
let inc : Decimal = val + one(); // E0284, unexpected
}
令我惊讶的是,编译器无法确定 one() 在最后两行中返回的类型。这是为什么呢?
【问题讨论】:
-
总结:实现
Add<Decimal, Output = Decimal>的类型可能很多,编译器不会选择一个。要修复它,最简单的方法可能是使用turbofish:let add = one::<Decimal>() + val(add上的: Decimal注释不是必需的,因为Add实现明确地确定了Output类型。) -
有没有办法让编译器显示它无法选择的内容? Decimal 只允许与其他 Decimal 相加(否则我将使用文字 '1' 代替),所以我不确定在这种特殊情况下的歧义是什么。
标签: rust type-inference