Fix tools
This commit is contained in:
parent
042464f75a
commit
0dda4154bd
7 changed files with 55 additions and 57 deletions
|
@ -5,37 +5,29 @@ as the `collect` method for `Iterator`s.
|
|||
For example:
|
||||
|
||||
```compile_fail,E0284
|
||||
fn foo() -> Result<bool, ()> {
|
||||
let results = [Ok(true), Ok(false), Err(())].iter().cloned();
|
||||
let v: Vec<bool> = results.collect()?;
|
||||
// Do things with v...
|
||||
Ok(true)
|
||||
fn main() {
|
||||
let n: u32 = 1;
|
||||
let mut d: u64 = 2;
|
||||
d = d + n.into();
|
||||
}
|
||||
```
|
||||
|
||||
Here we have an iterator `results` over `Result<bool, ()>`.
|
||||
Hence, `results.collect()` can return any type implementing
|
||||
`FromIterator<Result<bool, ()>>`. On the other hand, the
|
||||
`?` operator can accept any type implementing `Try`.
|
||||
Here we have an addition of `d` and `n.into()`. Hence, `n.into()` can return
|
||||
any type `T` where `u64: Add<T>`. On the other hand, the `into` method can
|
||||
rteurn any type where `u32: Into<T>`.
|
||||
|
||||
The author of this code probably wants `collect()` to return a
|
||||
`Result<Vec<bool>, ()>`, but the compiler can't be sure
|
||||
that there isn't another type `T` implementing both `Try` and
|
||||
`FromIterator<Result<bool, ()>>` in scope such that
|
||||
`T::Ok == Vec<bool>`. Hence, this code is ambiguous and an error
|
||||
is returned.
|
||||
The author of this code probably wants `into()` to return a `u64`, but the
|
||||
compiler can't be sure that there isn't another type `T` where both
|
||||
`u32: Into<T>` and `u64: Add<T>`.
|
||||
|
||||
To resolve this error, use a concrete type for the intermediate expression:
|
||||
|
||||
```
|
||||
fn foo() -> Result<bool, ()> {
|
||||
let results = [Ok(true), Ok(false), Err(())].iter().cloned();
|
||||
let v = {
|
||||
let temp: Result<Vec<bool>, ()> = results.collect();
|
||||
temp?
|
||||
};
|
||||
// Do things with v...
|
||||
Ok(true)
|
||||
fn main() {
|
||||
let n: u32 = 1;
|
||||
let mut d: u64 = 2;
|
||||
let m: u64 = n.into();
|
||||
d = d + m;
|
||||
}
|
||||
```
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue