gpt4 book ai didi

rust - 为什么类型推断在加法过程中不起作用,而在赋值过程中起作用

转载 作者:行者123 更新时间:2023-11-29 07:55:31 28 4
gpt4 key购买 nike

我正在使用 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 进行运算符重载的方式。对于像 a+b 这样的表达式, Rust 会先判断 a 的类型,假设它有类型 Tb类型为 U .当T工具 Add<U, Output = V>添加可以编译,结果类型将是 V .

在某些情况下,编译器可以推断出 a 的类型根据上下文,但在您的示例中并非如此。

因为 one()有多种实现 Add 的类型它无法确定哪种类型的特征 one()应该有。可能是f64工具 Add<Decimal, Output=Decimal> ,这会使您的表达模棱两可。

在表达式 val + one() 中第一个操作数的类型是确定的,但同样有 Add 的多种实现。可以应用:Add<Decimal, Output=Decimal> , Add<f64, Output=Decimal .

所有这些都可以通过注释 one() 来解决像这样:one::<Decimal>() .它具有明确的类型。

关于rust - 为什么类型推断在加法过程中不起作用,而在赋值过程中起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58779250/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com