我正在使用rust_decimal板条箱制作应用。我的应用程序的一部分涉及值“ 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()。为什么会这样?
这是因为只有一个类型¹可以分配给]Decimal
– Decimal
本身-但是可以有任意数量的类型可以添加到Decimal
。
类型。但是可能有许多类型满足该约束,并且编译器不会选择一种,因此会出现错误。let add: Decimal = one() + val;
one()
必须是实现Add<Decimal, Output = Decimal>
的some
let inc: Decimal = val + one();
在这种情况下,如果
one()
的类型为T
,则Decimal
必须实现Add<T, Output = Decimal>
。但是同样,可能有许多T
满足此约束,并且编译器不会选择一个。
要解决这两个错误,您可以明确地说您想要Decimal
的one
版本:
let add = one::<Decimal>() + val;
((不再需要
: Decimal
上的add
批注,因为Add
实现明确确定了Output
类型。]
¹好吧,这并非完全正确。可以强制到Decimal
的类型也可以分配给Decimal
变量。但是强制仅在编译器已经知道赋值的两面时才可行,因此在强制发生时您无法通过=
进行推断。