メソッドの返り値として参照を渡すとその変数の借用が発生する

use std::collections::HashMap;

#[derive(Debug)]
struct A {
    fields: Option<HashMap<i32, String>>,
}
impl A {
    fn get(&self, key: i32) -> Option<&String> {
        if let Some(ref fields) = self.fields {
            if let Some(value) = fields.get(&key) {
                //return Some(value.clone());
                return Some(value);
            }
        }
        return None;
    }
}

fn main() {
    let mut a = A { fields: Some(HashMap::new()), };
    if let Some(ref mut fields) = a.fields {
        fields.insert(5, "hello".to_string());
    }
    // aの借用が発生する
    let value = a.get(5);
    // したがってaの所有権を移すことは出来ない
    dbg!(a);
    // aの借用はここまで続く
    dbg!(value);
}

/*
error[E0505]: cannot move out of `a` because it is borrowed
   |
24 |     let value = a.get(5);
   |                 - borrow of `a` occurs here
25 |     dbg!(a);
   |     ^^^^^^^^ move out of `a` occurs here
26 |     dbg!(value);
   |          ----- borrow later used here
   |
*/