Это в основном потому, что 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 не может вывести получателя, возьмитеПосмотрите на , как работает процесс поиска метода Rust .Первым шагом является создание списка типов кандидатов на основе типа получателя.Это очевидно только тогда, когда вы знаете тип получателя.