Skip to content

Instantly share code, notes, and snippets.

@totem3
Last active August 6, 2020 07:39
Show Gist options
  • Save totem3/1088fab65968a66c1723019b4e2bf629 to your computer and use it in GitHub Desktop.
Save totem3/1088fab65968a66c1723019b4e2bf629 to your computer and use it in GitHub Desktop.
mapにするとうまくいかないやつがわかったとき
struct Nanika {
v: V,
}
struct V(u8);
impl V {
fn incr(&mut self) {
self.0 += 1
}
}
impl Nanika {
fn do_nanika(&mut self) -> Option<&V> {
self.v.incr();
Some(&V(1))
}
fn get_nanika(&self) -> Option<&V> {
Some(&self.v)
}
}
fn main() {
let mut n = Nanika { v: V(0) };
let v = n.v.0;
// これはOKだけどNoneのケースが冗長なので書きたくない
let _ = match n.do_nanika() {
Some(nanika) => Some(nanika.0 * n.v.0),
None => None
};
let _ = n.do_nanika().map(|nanika| {
// nanika.0 * n.v.0
// ^ これはエラー。
nanika.0 * v
});
// これは不変なのでOK
let _ = n.get_nanika().map(|nanika| {
nanika.0 * n.v.0
});
}
@totem3
Copy link
Author

totem3 commented Aug 6, 2020

error[E0502]: cannot borrow `n` as immutable because it is also borrowed as mutable
  --> .\scratch.rs:27:40
   |
27 |     let _ = Option::map(n.do_nanika(), |nanika| {
   |             ----------- -              ^^^^^^^^ immutable borrow occurs here
   |             |           |
   |             |           mutable borrow occurs here
   |             mutable borrow later used by call
28 |         nanika.0 * n.v.0
   |                    - second borrow occurs due to use of `n` in closure

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment