0

我试图简化我的程序,但如果我使用简单HashMap<u16, u16>而不是嵌套HashMap Polynome类,则不会出现错误。

您将需要这些导入来重现问题:

use std::collections::{HashMap, BTreeMap};
use std::hash::{Hash, Hasher};

这些是我的类型:

pub struct VarIdx(pub BTreeMap<u16, u8>);
pub type Polynome = HashMap<VarIdx, f64>;

这是我需要使嵌套HashMap工作的东西:

impl PartialEq for VarIdx {
    fn eq(&self, other: &VarIdx) -> bool {
        if self.0 == other.0 {
            return true;
        }
        if self.0.len() != other.0.len() {
            return false;
        }
        for (k, v) in self.0.iter() {
            match other.0.get(k) {
                Some(v1) => {
                    if v != v1 {
                        return false;
                    }
                }
                None => {}
            }

        }
        (true)
    }
}
impl Eq for VarIdx {}
impl VarIdx {
    pub fn len(&self) -> usize {
        return self.0.len();
    }
}
impl Hash for VarIdx {
    fn hash<H>(&self, _state: &mut H)
    where
        H: Hasher,
    {
        for (k, v) in self.0.iter() {
            k.hash(_state);
            v.hash(_state);
        }
    }
}

我有这个功能来找到第一个合理的关键:

fn get_first_product(poly: &Polynome) -> Option<&VarIdx> {
    for (key, coeff) in poly {
        if key.len() < 2 {
            return None;
        }
        return Some(key);
    }
    None
}

我想调用这个函数并根据返回的键执行一些操作,为简单起见,我想从HashMap

fn reduce_product(poly: &mut Polynome) -> bool {
    let key = {
        let res = get_first_product(poly);
        if res == None {
            return false;
        }
        res.unwrap()
    };
    poly.remove(&key);
    true
}

这不会编译,因为poly被借用get_first_product并且不能被重新借用:

error[E0502]: cannot borrow `*poly` as mutable because it is also borrowed as immutable
  --> src/main.rs:64:5
   |
60 |         let res = get_first_product(poly);
   |                                     ---- immutable borrow occurs here
...
64 |     poly.remove(&key);
   |     ^^^^ mutable borrow occurs here
65 |     true
66 | }
   | - immutable borrow ends here

我该如何解决这个基本任务?我在传递给.clone()之前尝试过,但我收到另一条错误消息:polyget_first_product()

error[E0599]: no method named `clone` found for type `&mut std::collections::HashMap<VarIdx, f64>` in the current scope
  --> src/main.rs:65:42
   |
65 |         let res = get_first_product(poly.clone());
   |                                          ^^^^^
   |
   = note: the method `clone` exists but the following trait bounds were not satisfied:
           `VarIdx : std::clone::Clone`

我已经.clone()VarIdx.

处理这种情况的推荐方法是什么?我想避免.clone有一个有效的程序。

这似乎与这个问题没有重复,因为如果我尝试使用非嵌套的 HashMap 而不是 Polynome,则代码编译得很好:

fn get_first_product_nonnested(poly: &HashMap<u16, u16>) -> Option<u16> {
    for (key, coeff) in poly {
        if coeff>&2 {
            return None;
        }
        return Some(*key);
    }
    None
}
fn reduce_product_nonnested(poly: &mut HashMap<u16,u16>) -> bool {
    let key = {
        let res = get_first_product_nonnested(poly);
        if res == None { return false; }
        res.unwrap()
    };
    poly.remove(&key);
    true
}

所以有些东西使我的 Polynome 类型与 HashMap 不同。

4

0 回答 0