当尝试使用多态时,出现“错误:不允许在结构定义中使用特质限定”。

7
编辑注:此问题是在Rust 1.0之前和某些功能实施之前提出的。现有代码今天可以使用。
我正在用Rust编写一个棋盘游戏AI。游戏有多个规则集,我希望将规则逻辑与棋盘布局分开(它们目前混合在一起)。在像Ruby这样的语言中,我会让单独的规则集实现相同的接口。在Rust中,我考虑使用trait并将Board参数化为我想要使用的规则集(例如Board ::new())。
但是,在结构体(如Board)中保存实现此trait的对象是不允许的。我可以将规则转换为枚举,但我觉得它看起来有点凌乱,因为我无法为枚举成员定义单独的实现。使用模式匹配可以解决问题,但这会沿着函数轴而不是结构体轴拆分功能。这只是我必须面对的事情还是有其他方法?下面的代码是我想使用的:
pub struct Rules1;
pub struct Rules2;

trait Rules {
    fn move_allowed() -> bool;
}

impl Rules for Rules1 {
    fn move_allowed() -> bool {
        true
    }
}

impl Rules for Rules2 {
    fn move_allowed() -> bool {
        false
    }
}

struct Board<R: Rules> {
    rules: R
}

fn main() {}

它会产生以下错误:
test.rs:20:1: 22:2 error: trait bounds are not allowed in structure definitions
test.rs:20 struct Board<R: Rules> {
test.rs:21     rules: R
test.rs:22 }
error: aborting due to previous error
1个回答

11

这个问题中提供的代码在最新版本的Rust上都可以运行,现在允许在结构体上使用特质边界。原始答案仍然有效。


你需要在特质实现中进行改进,而不是在结构体定义中。

pub struct Rules1;
pub struct Rules2;

trait Rules {
    fn move_allowed(&self) -> bool;
}

impl Rules for Rules1 {
    fn move_allowed(&self) -> bool {
        true
    }
}

impl Rules for Rules2 {
    fn move_allowed(&self) -> bool {
        false
    }
}

struct Board<R> {
    rules: R,
}

impl<R: Rules> Board<R> {
    fn move_allowed(&self) -> bool {
        self.rules.move_allowed()
    }
}

fn main() {
    let board = Board { rules: Rules2 };
    assert!(!board.move_allowed());
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接