| #### Note: this error code is no longer emitted by the compiler. | |
| The type-checker needed to know the type of an expression, but that type had not | |
| yet been inferred. | |
| Erroneous code example: | |
| ```compile_fail | |
| let mut x = vec![]; | |
| match x.pop() { | |
| Some(v) => { | |
| // Here, the type of `v` is not (yet) known, so we | |
| // cannot resolve this method call: | |
| v.to_uppercase(); // error: the type of this value must be known in | |
| // this context | |
| } | |
| None => {} | |
| } | |
| ``` | |
| Type inference typically proceeds from the top of the function to the bottom, | |
| figuring out types as it goes. In some cases -- notably method calls and | |
| overloadable operators like `*` -- the type checker may not have enough | |
| information *yet* to make progress. This can be true even if the rest of the | |
| function provides enough context (because the type-checker hasn't looked that | |
| far ahead yet). In this case, type annotations can be used to help it along. | |
| To fix this error, just specify the type of the variable. Example: | |
| ``` | |
| let mut x: Vec<String> = vec![]; // We precise the type of the vec elements. | |
| match x.pop() { | |
| Some(v) => { | |
| v.to_uppercase(); // Since rustc now knows the type of the vec elements, | |
| // we can use `v`'s methods. | |
| } | |
| None => {} | |
| } | |
| ``` |