Enums &引用;错误:结构定义中不允许特征边界“;尝试使用多态性时

Enums &引用;错误:结构定义中不允许特征边界“;尝试使用多态性时,enums,rust,polymorphism,rust-obsolete,Enums,Rust,Polymorphism,Rust Obsolete,编者按:这个问题是在Rust 1.0之前和某些功能实现之前提出的。目前的代码仍然有效 我正在用Rust写一个棋盘游戏AI。游戏有多个规则集,我希望将规则逻辑从棋盘布局中分离出来(它们目前是混合的)。在Ruby这样的语言中,我会让不同的规则集实现相同的接口。在Rust中,我考虑使用一个trait并用我想要使用的规则集(例如Board::new())参数化板 不允许在结构中保存实现此特性的对象(如Board)。我可以将规则转换为枚举,但它看起来有点混乱,因为我无法为枚举的成员定义单独的实现。使用模式

编者按:这个问题是在Rust 1.0之前和某些功能实现之前提出的。目前的代码仍然有效

我正在用Rust写一个棋盘游戏AI。游戏有多个规则集,我希望将规则逻辑从棋盘布局中分离出来(它们目前是混合的)。在Ruby这样的语言中,我会让不同的规则集实现相同的接口。在Rust中,我考虑使用一个trait并用我想要使用的规则集(例如
Board::new()
)参数化

不允许在结构中保存实现此特性的对象(如
Board
)。我可以将
规则
转换为
枚举
,但它看起来有点混乱,因为我无法为枚举的成员定义单独的实现。使用模式匹配可以工作,但这会沿功能轴而不是结构轴拆分功能。这是我不得不忍受的还是有什么办法

以下代码是我想要使用的:

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() {}
pub结构规则1;
发布结构规则2;
特质规则{
fn move_allowed()->bool;
}
规则1的impl规则{
fn允许移动()->bool{
真的
}
}
规则2的impl规则{
fn允许移动()->bool{
假的
}
}
结构板{
规则:R
}
fn main(){}
它会产生以下错误:

test.rs:20:1:22:2错误:结构定义中不允许特性边界
测试:rs:20结构板{
测试。rs:21规则:R
test.rs:22}
错误:由于上一个错误而中止

问题中给出的代码适用于所有最新版本的Rust,现在允许在结构上使用特征边界。原来的答案仍然有效


您需要在trait实现中改进它,而不是在struct定义中

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());
}
pub结构规则1;
发布结构规则2;
特质规则{
fn允许移动(&self)->bool;
}
规则1的impl规则{
fn允许移动(&self)->bool{
真的
}
}
规则2的impl规则{
fn允许移动(&self)->bool{
假的
}
}
结构板{
规则:R,
}
impl板{
fn允许移动(&self)->bool{
self.rules.move_allowed()
}
}
fn main(){
let board=董事会{规则:规则2};
断言!(!board.move_allowed());
}