gpt4 book ai didi

Rust 类型推断异常

转载 作者:行者123 更新时间:2023-11-29 07:52:15 26 4
gpt4 key购买 nike

我之前遇到了一个奇怪的情况。我写道:

if rand::random() < self.food_chance {...}

(self.food_chancef32 类型)

我得到了一个类型推断错误:

   |
71 | if rand::random() < self.food_chance {
| ^^^^^^^^^^^^ cannot infer type for `T`

但是这段代码可以编译

if self.food_chance > rand::random() {...}

我还在想。这种行为有原因吗?它甚至是有意的行为吗?

我对类型推断理论略知一二,而且我知道大多数算法都与 lhs/rhs 无关,所以我很想认为这是预期的行为,而不是直接的错误。

我试着四处搜索,但我从来没有找到任何接近这个的东西。

最佳答案

这基本上是因为 Rust 永远无法推断出接收者的类型。必须知道接收器的类型才能执行方法查找,并且由于

rand::random() < self.food_chance

相当于

std::cmp::PartialOrd::lt(&rand::random(), &self.food_chance);

接收者是左边的操作数。

在表达式中

self.food_chance > rand::random()

另一方面,接收者是已知的,因此 Rust 可以执行方法查找。它只会为 f32 找到一个实现。作为接收者,即PartialOrd<f32> ,然后依次确定右侧的类型。如果有不同右侧类型的实现,那么 Rust 也无法在这种情况下推断类型。

要了解为什么 Rust 无法推断接收者,请查看how Rust's method lookup process works .第一步是根据接收者的类型构建候选类型列表。这显然只有在您已经知道接收器的类型时才有效。

关于Rust 类型推断异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53467419/

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