Как я должен уменьшить повторение в сигнатурах типа ржавчины? - PullRequest
4 голосов
/ 21 марта 2020

У меня есть следующий рабочий код, который не очень DRY:

impl<'a, G, E, N, EW, NW, ER, NOW, EOW> Overlay<'a, G, E, N, EW, NW, ER, NOW, EOW>
where
    &'a G: GraphBase<EdgeId = E, NodeId = N> +
           Data<EdgeWeight = EW, NodeWeight = NW> +
           DataMap,
    ER: EdgeRef<Weight = EW, EdgeId = E, NodeId = N>,
    E: Copy + Eq + Hash,
    N: Copy + Eq + Hash,
{
    fn overlayed_elements(&'a self) -> OverlayedItems<'a, G, E, N, EW, NW, ER, NOW, EOW>{
        OverlayedItems{
            overlay: self,
            phase: Phase::Nodes(self.nodes.iter()),
            node_indexes: HashMap::new(),
        }
    }
    pub fn overlay_edge<'b>(&'b mut self, edge: ER, eow: EOW) {
        self.edges.insert(edge.id(), eow);
        self.edge_refs.insert(edge.id(), edge);
    }
    pub fn overlay_node<'b>(&'b mut self, node: N, now: NOW) {
        self.nodes.insert(node, now);
    }
    fn remove_edge<'b>(&'b mut self, edge: E) {
        self.edges.remove(&edge);
        self.edge_refs.remove(&edge);
    }
    fn remove_node<'b>(&'b mut self, node: N) {
        self.nodes.remove(&node);
    }
}

context

детская площадка

У меня много повторений <'a, G, E, N, EW, NW, ER, NOW, EOW> и, как правило, кажется, что все эти черты занимают много места. Это просто плохой код или я что-то не так делаю?

1 Ответ

5 голосов
/ 21 марта 2020

Связанные типы не всегда должны иметь свои собственные параметры типа. Например, вы можете написать G::EdgeId в границах вместо отдельного параметра E.

Я изменил код в ссылке на игровую площадку, чтобы уменьшить количество аргументов типа. Вот обновленная ссылка . Например, Overlay теперь имеет 4 вместо 8 аргументов типа:

pub struct Overlay<G, ER, NOW, EOW>
where
    G: GraphBase + Data,
    ER: EdgeRef<Weight = G::EdgeWeight, EdgeId = G::EdgeId, NodeId = G::NodeId>,
{
    nodes: HashMap<G::NodeId, NOW>,
    edges: HashMap<G::EdgeId, EOW>,
    edge_refs: HashMap<G::EdgeId, ER>,
    graph: G,
}

Обратите внимание, что я удалил (ненужные) Copy + Eq + Hash границы черт для G::NodeId и G::EdgeId. Кроме того, G больше не находится за ссылкой в ​​границах признаков, что может вызвать проблемы со временем жизни, но при необходимости их можно исправить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...