Struct 如何类型转换和继承Rust结构?

Struct 如何类型转换和继承Rust结构?,struct,rust,Struct,Rust,我正在使用实验特性特性(struct\u inherit) 我有LocalPlayer和NetPlayer结构,它们都实现了Inputable特性,并从虚拟结构player继承player\u num字段。根据游戏的启动方式,我的程序中的player_2可以是LocalPlayer或NetPlayer。根据哪一个,实现可输入特性的方式会发生变化 编译器不允许我根据是NetPlayer还是LocalPlayer动态分配player\u 2类型。它抱怨说: 错误:类型不匹配:应为~player::L

我正在使用实验特性
特性(struct\u inherit)

我有
LocalPlayer
NetPlayer
结构,它们都实现了
Inputable
特性,并从虚拟结构
player
继承
player\u num
字段。根据游戏的启动方式,我的程序中的
player_2
可以是
LocalPlayer
NetPlayer
。根据哪一个,实现
可输入
特性的方式会发生变化

编译器不允许我根据是
NetPlayer
还是
LocalPlayer
动态分配
player\u 2
类型。它抱怨说:

错误:类型不匹配:应为
~player::LocalPlayer
但找到
~player::NetPlayer
(应为struct player::LocalPlayer但找到struct player::NetPlayer)

它也不允许我键入
NetPlayer
LocalPlayer
指向
Player
指针的指针。它声称它们是不可伸缩的

所讨论的代码示例如下:

let player1=box player::LocalPlayer::new(0);
让玩家2;
如果是本地的{
player2=box player::LocalPlayer::new(1);
}否则,如果托管{
player2=box-player::NetPlayer::new(1);
player2.host();
}否则{
player2=box-player::NetPlayer::new(1);
player2.connect();
}
/* ... 省略的代码*/
让输入=player2.get_input();//特征函数
结构实现如下所示:

pub虚拟结构播放器{
玩家编号:uint
}
pub结构LocalPlayer:Player;
pub-struct-NetPlayer:Player;

Rust中的结构继承非常原始;你可能不想用它。Rust中的继承结构之间没有子类型或强制。该功能基本上只允许您在有大量具有类似字段的结构的情况下保存键入(这也是未来可能在其周围添加更多功能的证明)


您可以制作
Player
LocalPlayer
NetPlayer
特性。然后,您可以在它们之间获得您想要的子类型行为。或者,您可以只创建
LocalPlayer
NetPlayer
结构,让
Player
成为一种特性。您甚至可以拥有一个
PlayerImpl
结构,您可以按照当前的方式继承它(如果您有许多字段要共享),但您需要为这两个结构编写独立的impl。

我最终实现了
Player
作为枚举:

pub enum Player {
    Net(NetPlayer),
    Local(LocalPlayer)
}
每次调用共享函数时,我都需要执行以下操作:

let input = match player2 {
    player::Net(player) => player.get_input(),
    player::Local(player) => player.get_input(),
};

Rust的特性类似于接口,可以组合起来模拟接口的层次结构。它们通常是继承的替代品:

trait GetInput {
    fn get_input(&self);
}

impl GetInput for Player {
    fn get_input(&self) {}
}

impl GetInput for NetPlayer {
    fn get_input(&self) {}
}

// Fast: interface selected at compile time
fn do_something<T: GetInput>(player: T) {
    player.get_input();
}

// Flexible: interface selected at run time (virtual call)
// Use with Box<Player> (see "Trait Objects")
fn do_something_dyn(player: &dyn GetInput) {
    player.get_input();
}
trait GetInput{
fn获取_输入(&self);
}
播放器的impl GetInput{
fn获取_输入(&self){}
}
NetPlayer的impl GetInput{
fn获取_输入(&self){}
}
//Fast:编译时选择的接口
fn做些什么(玩家:T){
player.get_input();
}
//灵活:在运行时选择接口(虚拟调用)
//与框一起使用(请参见“特征对象”)
fn做某事(玩家:&dyn获取输入){
player.get_input();
}

但是,Rust没有数据的继承性。要在类型之间共享公共字段,您需要一些可选的DIY解决方案(例如,traits或带有枚举的结构中的getter/setter)

从什么时候开始Rust就有了虚拟结构和结构继承?据我所知,这方面的各种RFC仍在等待中。@Vladimitmaveev:据我所知,这是一个部分实现的功能,还不能完成所要求的内容。我是通过#使用实验功能的![feature(struct_inherit)]@ChrisMorgan,奇怪的是它根本没有广告。@vladimirmaveev:这是有原因的。你可以在枚举上实现方法,你知道:例如
impl Player{fn get_input(&self)->?{match*self{Net(ref Player)=>Player.get_input(),Local(ref Player)=>Player.get_input()}}
Awesome,我不知道!但是假设我只想使用结构继承将父结构的字段“嵌入”到子结构中。事实上,我确实希望有原始结构继承。我该怎么做?没有关于这方面的文档可供查找。