为什么类型推断在分配期间不起作用,而在添加过程中却不起作用

问题描述 投票:2回答:1

我正在使用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()。为什么会这样?

rust type-inference
1个回答
0
投票

这是因为只有一个类型¹可以分配给]DecimalDecimal本身-但是可以有任意数量的类型可以添加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满足此约束,并且编译器不会选择一个。

要解决这两个错误,您可以明确地说您想要Decimalone版本:

let add = one::<Decimal>() + val;

((不再需要: Decimal上的add批注,因为Add实现明确确定了Output类型。]

相关问答

可推断的情况,但求解器仍无法弄清楚。

¹好吧,这并非完全正确。可以强制到Decimal的类型也可以分配给Decimal变量。但是强制仅在编译器已经知道赋值的两面时才可行,因此在强制发生时您无法通过=进行推断。

© www.soinside.com 2019 - 2024. All rights reserved.