Я не знаю полного ответа и почти ничего не знаю о внутренней работе компилятора Rust, но вот некоторые выводы, к которым я пришел из своего опыта работы с Rust.
ИнформацияО типах в Rust может "течь в обратном направлении", но бывают определенные моменты, когда Rust должен знать (абсолютно точно) тип выражения.В этих ситуациях он должен «уже» знать тип, то есть он не будет продолжать смотреть вперед.
Из того, что я видел, эта ситуация ограничена вызовами методов.Я подозреваю, что это как-то связано с тем, что методы могут быть реализованы по признакам, что существенно усложняет ситуацию.Я сомневаюсь, что есть какие-либо черты в области применения метода с именем some_method
, но я думаю, что всякий раз, когда компилятор Rust встречает вызов метода, он требует, чтобы тип уже был известен наверняка.
Вы можете увидеть это lot с вызовами методов для типов, которые реализуют признаки, наиболее распространенным из которых является метод collect
для типа, который реализует характеристику Iter
.Вы сможете вызывать collect
, но не сможете вызывать какие-либо методы для результата, если вы не укажете тип.
Так что это работает:
fn create_numbers(last_num: i32) -> Vec<i32> {
let x = (0..10).collect();
x
}
Но этоне:
fn create_numbers(last_num: i32) -> Vec<i32> {
let x = (0..10).collect();
// In order to call `push`, we need to *already* know the type
// of x for "absolute certain", and the Rust compiler doesn't
// keep looking forward
x.push(42);
x
}