Странность типа ржавчины - PullRequest
0 голосов
/ 25 ноября 2018

Я столкнулся со странной ситуацией ранее.Я написал:

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

(self.food_chance имеет тип f32)

, и я получил ошибку вывода типа:

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

Однако этот код компилируется

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

И мне интересно.Есть ли причина для такого поведения?Это даже предполагаемое поведение?

Я немного знаком с теорией вывода типов, и я знаю, что большинство алгоритмов не зависят от lhs / rhs, поэтому я склонен думать, что это ожидаемое поведение, а неисправлю ошибку.

Я пытался искать, но ничего подобного не нашел.

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

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

0 голосов
/ 25 ноября 2018

Оператор > является сахаром для метода;метод partial_cmp черты PartialOrd.Метод вызывается с левой стороны в качестве аргумента self;это определяет, какая реализация PartialOrd используется.Поскольку вы могли бы реализовать черту PartialOrd для различных типов с f32 в качестве правого типа, реализация PartialOrd определяется только однозначно, если известен тип левой стороны.Эта реализация PartialOrd, в свою очередь, определяет тип, требуемый от rand::random.

...