Почему это разрешено:
let payload = "key1=value1";
let value: Vec<&str> = payload.split("=").collect();
let value = value[1];
println!("value is {:?}", value);
Но не это:
let payload = "key1=value1";
let value: Vec<&str> = payload.split("=").collect()[1];
println!("value is {:?}", value);
Это приводит к ошибке:
error[E0282]: type annotations needed
--> src/main.rs:3:47
|
3 | let value: Vec<&str> = payload.split("=").collect()[1];
| ^^^^^^^
| |
| cannot infer type for type parameter `B` declared on the method `collect`
| help: consider specifying the type argument in the method call: `collect::<B>`
|
= note: type must be known at this point
Это не два эквивалент? Это одни и те же токены для анализа , с точки зрения компилятора, просто разделенные на разные строки.
Я не понимаю, какая дополнительная информация присутствует в первом синтаксисе, чтобы сделать вывод возможным .
Возможно, дело не в том, что вывод невозможен, как предупреждает компилятор, но это не разрешено из-за синтаксиса Rust, соглашения и т.д. c.?
Я пытаюсь понять почему не может сделать вывод компилятора (т.е. логически недостающая информация? только в соответствии с соглашением?), а не как исправить этот конкретный c случай.
Мышление об этом на уровне компилятора / парсера,
выражение : let value: Vec<&str> = payload.split("=").collect()
суффикс : [1]
A (приемлемо):
(expression)
(expression')(suffix)
B (неприемлемо):
(expression)(suffix)
Учитывая, что expression'
в основном добавляет value = value
, что является тавтологией и не добавляет никакой новой информации,
Если expression
и expression'
имеют одинаковый объем информации, почему B недействителен для компилятора? Почему он не может сделать то же самое в B, если нет новой информации?
Я сомневаюсь в части «не могу сделать вывод» конкретно, а не в том, что «должно быть XX из-за синтаксиса / соглашения Rust YY»).
Это просто ограничение компилятора или преднамеренная ошибка для обеспечения удобочитаемости, или уникальная информация добавляется из одного случая в другой? (логически отличный сценарий ios).