【发布时间】:2020-03-19 22:42:23
【问题描述】:
如何在 Rust 中使用相关的泛型类型?
这是我得到的(只有第一行给我带来了麻烦):
impl<G, GS> TreeNode<GS> where G: Game, GS: GameState<G>{
pub fn expand(&mut self, game: &G){
if !self.expanded{
let child_states = self.data.generate_children(game);
for state in child_states{
self.add_child_with_value(state);
}
}
}
}
GameState 是Game 的通用特征,self.data 实现了这种类型的GameState<Game>。编译器告诉我
error[E0207]: the type parameter `G` is not constrained by the impl trait, self type, or predicates
--> src/mcts.rs:42:6
|
42 | impl<G, GS> TreeNode<GS> where G: Game, GS: GameState<G>{
| ^ unconstrained type parameter
error: aborting due to previous error
但在我看来,我在 expand 函数和 G 需要属于 GS 的事实中都限制了 G。非常感谢任何帮助。
编辑: 以下是目前更多的定义
trait GameState<G: Game>: std::marker::Sized + Debug{
fn generate_children(&self, game: &G) -> Vec<Self>;
fn get_initial_state(game: &G) -> Self;
}
trait Game{}
struct TreeNode<S> where S: Sized{
parent: *mut TreeNode<S>,
expanded: bool,
pub children: Vec<TreeNode<S>>,
pub data: S,
pub n: u32
}
impl<S> TreeNode<S>{
pub fn new(data: S) -> Self{
TreeNode {
parent: null_mut(),
expanded: false,
children: vec![],
data,
n: 0
}
}
pub fn add_child(&mut self, mut node: TreeNode<S>){
node.parent = self;
self.children.push(node);
}
pub fn add_child_with_value(&mut self, val: S){
let new_node = TreeNode::new(val);
self.add_child(new_node);
}
pub fn parent(&self) -> &Self{
unsafe{
&*self.parent
}
}
}
【问题讨论】:
-
什么是
Game? -
Game当前是一个空特征。唯一重要的是GameState在其扩展函数中获得了正确类型的Game。该代码用于为棋盘游戏生成蒙特卡洛树。