特定の入力に対して既知の値を含むHashMap
を作成しようとしています。この入力は、特定の特性を実装している限り、複数の型を受け入れることができます。しかし、この場合、特定のタイプのみが与えられ、Rustは好きではありません。錆構造体はHashMapの形質を置き換えることができません
構造体を「形質」に変換する方法はありますか?そうでなければこの問題を修正しますか?
#![allow(unused)]
use std::collections::HashMap;
use std::hash::*;
trait Element: Eq + PartialEq + Hash {}
trait Reaction<T: Element> {}
#[derive(Eq, Hash, PartialEq)]
struct Ion {
charge: u16
}
impl Element for Ion {}
#[derive(Eq, Hash, PartialEq)]
struct RedoxReaction<T: Element> { left: T }
impl<T: Element> Reaction<T> for RedoxReaction<T> {}
fn get_sep_database<T: Element>() -> HashMap<RedoxReaction<T>, f32> {
let mut map: HashMap<RedoxReaction<T>, f32> = HashMap::new();
let reaction = RedoxReaction {
left: Ion {
charge: 1
}
};
// note: expected type `RedoxReaction<T>`
// found type `RedoxReaction<Ion>`
map.insert(reaction, 0.000 as f32);
return map;
}
fn main() {
let db = get_sep_database();
let reaction = RedoxReaction {
left: Ion {
charge: 1
}
};
// expected this to be 0.000
let sep = db.get(&reaction);
}
あなたの答えをありがとう。しかし、あなたが推測しているように、実行時に新しい 'Element's(この場合は' Molecule's)を作成したいと思います。 enumで可能なのかどうかはわかりません。今のところ、私は自分のコードをどのように変更できるかを見ていきます。 – Charlie
これは次のようになります: 'Element'特性を実装した各構造体に対して、代わりに' Element'列挙型にバリアントを追加します。 Rustでは実行時に型を作成することはできません。また、実行時に列挙型を作成することもできません。そのため、型のファミリの代わりに列挙型を使用しても問題はありません。 –