gpt4 book ai didi

rust - new() 方法返回通用 'impl trait' 值

转载 作者:行者123 更新时间:2023-12-03 11:41:58 25 4
gpt4 key购买 nike

我是 Rust 语言的新手,想创建一个小游戏来学习它。
我想要一个 玩家特质 将应用于 2 类玩家的特征:本地播放 r 和 电脑 , 像那样 :

struct LocalPlayer{
//...
}

struct Computer {
//...
}

trait PlayerTrait {
fn play_turn(&self);
}

impl PlayerTrait for LocalPlayer{...}
impl PlayerTrait for Computer{...}

与 java 接口(interface)一样,我希望能够编写通用代码,根据它是 AI 还是实际玩家来执行不同的操作。

经过一些徒劳的研究,我的 Game 结构看起来像这样:
struct Game<T:PlayerTrait> {
player1 : T,
player2 : T
}

impl<T:PlayerTrait> Game<T> {
pub fn new() -> Self {
Game {
player1 : LocalPlayer::new(),
player2 : Computer::new()
}
}

}

但是,我无法实例化播放器。

我的 本地播放器 new() 方法看起来像这样:( Computer 的方法现在完全一样)

impl LocalPlayer{
pub fn new() -> Self {
LocalPlayer {
//...
}
}
}

给出: ... expected type parameter `T`, found struct `util::game::player::LocalPlayer
LocalPlayer 和 Computer 都在实现这个特性,所以我不明白为什么它不能编译。我尝试更改 -> impl PlayerTrait 的返回类型, -> Box<PlayerTrait> (潜伏在不同的网站上之后)仍然无法使其工作。
对不起,如果这是一个愚蠢的问题,我错过了什么吗?

如果它可能有帮助,在修改代码时我也会经常遇到这个错误: ... expected type 'T' parameter , found opaque type

最佳答案

T并不表示“PlayerTrait 实体”,而是表示“ 一种 的类型,即 PlayerTrait”。因此,如果其中一名玩家似乎是 Computer然后编译器编译你的Game好像是:

struct Game {
player1 : Computer,
player2 : Computer,
}

如果 T将是 LocalPlayer那么两个玩家都将被编译为他们。要解决此问题,请在 Game 中添加另一个模板类型。 :
struct Game<T1:PlayerTrait, T2:PlayerTrait> {
player1 : T1,
player2 : T2,
}

并根据这两种类型更改其余代码。
这样,你得到 一个单独的 Game根据 PlayerTraits 组合的类别出现在您的代码中。

这是一个足够好的解决方案,它没有任何性能缺陷,因为您可以为您拥有的任何玩家获得一个单独的编译类。您的程序不需要像 Java 中那样的动态多态性,在 Java 中,JVM 必须找到您在运行时调用的函数的适当覆盖(这不是太慢,但更慢)。

另一方面,如果您有 10000 种不同的组合,那么您将获得 10000 个类别,用于存储在您的内存中的所有组合。

有时你可能想从 Java 复制一个行为(即通过一个 trait 上的引用来存储一个对象,也就是接口(interface)上的 Java 引用)。为此,您可以使用
struct Game {
player1 : Box<dyn PlayerTrait>,
player2 : Box<dyn PlayerTrait>,
}

这将启用动态多态性:您将只有 1 个已编译类的副本,玩家的行为在运行时确定(有点慢),两个玩家对象都存储在堆上。

关于rust - new() 方法返回通用 'impl trait' 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61717441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com