46
Vývoj / Re:Rust - std::ANY alebo lepší návrh?
« kdy: 18. 11. 2021, 09:38:16 »K tomu navrhu cez Lazy Init, super napad, rovno to pouzijem, uvazoval som ale nic lepsie ma prakticky na momentalne sksuenosti nenapada.Jde to elegantněji přes get_or_insert.
HashSet::get_or_insert je nightly, a stejně nevím jak by se to na to dalo použít. Šlo by použít get_or_insert_with, a tu closure na počítání hodnoty k vložení do HashSety zneužít k inicializaci tabulky takhle: https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=d221825d869185554b7077d109a55157 , ale jestli je to elegantnější, to je s otazníkem. Je fakt, že to možná bude o trochu rychlejší, odpadne duplicitní lookup, ale možná že by to optimalizátor v té první verzi eliminoval.
Kdybych nechtěl používat nightly a chtěl to takhle v jednom kroku, dala by se místo HashSet použít HashMap<TypeId, ()> a entry api HashMap-y, za cenu jistého zamlžení sémantiky (premature optimization is the root of all evil, že).
K tomu pro zajímavost - přesně takhle je v rustu implementovaná HashSet - když to zjednoduším, je to obal nad HashMapou s unit hodnotama, mírně zjednodušeno
pub struct HashSet<T> {
map: HashMap<T, ()>,
}
impl<T> HashSet<T> {
pub fn contains<Q>(&self, value: &Q) -> bool
{
self.map.contains_key(value)
}
// atp...
}
Přijde mi naprosto úžasný, že takhle definovaná HashSeta je optimálně rychlá, nemusí se znovu nic reimplementovat, unit hodnoty vnitřní hashmapy se vyoptimalizují pryč.