use std::collections::HashMap;
use std::io::{self, Error, ErrorKind};
pub struct A {
x: i32,
}
pub struct B {
a: u32,
}
impl std::hash::Hash for A {
fn hash<H>(&self, state: &mut H) -> Result<(), io::Error>
where
H: std::hash::Hasher,
{
if self.x == 5 {
return Error::new(ErrorKind::Other, "oh no!");
}
state.write_i32(self.x);
state.finish();
}
}
impl PartialEq for A {
fn eq(&self, other: &A) -> bool {
self.x == other.x
}
}
impl Eq for A {}
fn main() {
let mut map = HashMap::new();
map.insert(
A {
x: 10,
},
B { a: 1 },
);
}
dXNlIHN0ZDo6Y29sbGVjdGlvbnM6Okhhc2hNYXA7CnVzZSBzdGQ6OmlvOjp7c2VsZiwgRXJyb3IsIEVycm9yS2luZH07CgpwdWIgc3RydWN0IEEgewogICAgeDogaTMyLAp9CgpwdWIgc3RydWN0IEIgewogICAgYTogdTMyLAp9CgppbXBsIHN0ZDo6aGFzaDo6SGFzaCBmb3IgQSB7CiAgICBmbiBoYXNoPEg+KCZzZWxmLCBzdGF0ZTogJm11dCBIKSAtPiBSZXN1bHQ8KCksIGlvOjpFcnJvcj4KICAgIHdoZXJlCiAgICAgICAgSDogc3RkOjpoYXNoOjpIYXNoZXIsCiAgICB7CiAgICAgICAgaWYgc2VsZi54ID09IDUgewogICAgICAgICAgcmV0dXJuIEVycm9yOjpuZXcoRXJyb3JLaW5kOjpPdGhlciwgIm9oIG5vISIpOwogICAgICAgIH0KICAgICAgICBzdGF0ZS53cml0ZV9pMzIoc2VsZi54KTsKICAgICAgICBzdGF0ZS5maW5pc2goKTsKICAgIH0KfQoKaW1wbCBQYXJ0aWFsRXEgZm9yIEEgewogICAgZm4gZXEoJnNlbGYsIG90aGVyOiAmQSkgLT4gYm9vbCB7CiAgICAgICAgc2VsZi54ID09IG90aGVyLngKICAgIH0KfQoKaW1wbCBFcSBmb3IgQSB7fQoKZm4gbWFpbigpIHsKICAgIGxldCBtdXQgbWFwID0gSGFzaE1hcDo6bmV3KCk7CiAgICBtYXAuaW5zZXJ0KAogICAgICAgIEEgewogICAgICAgICAgICB4OiAxMCwKICAgICAgICB9LAogICAgICAgIEIgeyBhOiAxIH0sCiAgICApOwp9
error[E0053]: method `hash` has an incompatible type for trait
--> prog.rs:13:41
|
13 | fn hash<H>(&self, state: &mut H) -> Result<(), io::Error>
| ^^^^^^^^^^^^^^^^^^^^^
| |
| expected `()`, found enum `Result`
| help: change the output type to match the trait: `()`
|
= note: expected fn pointer `fn(&A, &mut H)`
found fn pointer `fn(&A, &mut H) -> Result<(), std::io::Error>`
error[E0308]: mismatched types
--> prog.rs:18:18
|
13 | fn hash<H>(&self, state: &mut H) -> Result<(), io::Error>
| --------------------- expected `Result<(), std::io::Error>` because of return type
...
18 | return Error::new(ErrorKind::Other, "oh no!");
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
| expected enum `Result`, found struct `std::io::Error`
| help: try using a variant of the expected enum: `Err(Error::new(ErrorKind::Other, "oh no!"))`
|
= note: expected enum `Result<(), std::io::Error>`
found struct `std::io::Error`
error[E0308]: mismatched types
--> prog.rs:13:41
|
13 | fn hash<H>(&self, state: &mut H) -> Result<(), io::Error>
| ---- ^^^^^^^^^^^^^^^^^^^^^ expected enum `Result`, found `()`
| |
| implicitly returns `()` as its body has no tail or `return` expression
|
= note: expected enum `Result<(), std::io::Error>`
found unit type `()`
error: aborting due to 3 previous errors
Some errors have detailed explanations: E0053, E0308.
For more information about an error, try `rustc --explain E0053`.