重写 Rust 中的总体特征实现

2024-01-03

对于我的游戏规则引擎,我有一个核心特征,称为Rule处理游戏回调。有两种类型Rules: a BaseRule适用于游戏中的任何实体,并且CreatureRule仅适用于生物。我目前的代码结构如下:

trait BaseRule<T> {
    fn on_turn_start(&self, owner: &T) {}
}

#[typetag::serde(tag = "type")]
pub trait CreatureRule: BaseRule<Creature> {
    fn on_death(&self, owner: &Creature) {}
}

这工作正常,但有点烦人,因为你需要同时实现Rule and CreatureRule对于每一个实施。我试图全面实施BaseRule:

impl<R: CreatureRule> BaseRule<Creature> for R {
}

但是如果我尝试添加新的实现,这会带来冲突BaseRule特质,例如通过

impl BaseRule<Creature> for BaseMeleeDamageAttack {
    fn on_turn_start(&self, owner: &Creature) {
        // do stuff
    }
}

因为同一特征不可能有两个实现。有没有办法我可以提供一个全面的默认实现BaseRule到实现的类型CreatureRule但仍然允许他们覆盖函数的默认实现?

(如果可能的话,我宁愿避免使用泛型类型参数CreatureRule因为 Serde 序列化不适用于泛型类型的特征。)


我认为你必须为每个手动实现它,但它只有一行:

impl BaseRule<Creature> for ... {}

自动实现需要宏(这会使代码可读性较差)或 impl 专门化(rust-lang/rfcs#1210 https://github.com/rust-lang/rfcs/pull/1210 and rust-lang/rust#31844 https://github.com/rust-lang/rust/issues/31844),目前需要每晚。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

重写 Rust 中的总体特征实现 的相关文章

随机推荐

  • 尝试加载字体时出现 GD 错误

    我尝试通过以下方式加载字体图像加载字体 http www php net manual en function imageloadfont php功能 当我运行脚本时 我收到错误 gd warning product of memory a
  • R语言,暂停循环并要求用户继续

    我有一个想法在某些迭代中暂停循环并向 用户 询问一些答案 例如 some value 0 some criteria 50 for i in 1 100 some value some value i if some value gt so
  • 如何捕获无效的用户输入[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我不理解 Try throw catch 语句 并且想知道当代码中的所有 put 都应该是 int 时 捕获 char 的最佳方式是什么 这
  • TableView 单元格分隔线未延伸到整个单元格

    我正在开发一个新项目 并在 UI 中使用了故事板 我的所有 tableView 都存在行分隔符问题 下图显示了两条线 第一个是在属性检查器中设置的蓝色 第二个是黑色的 添加了我放置在单元格中的 imageView 该线确实延伸到单元格的右侧
  • 如何在 Java 中连接两个列表?

    有没有比以下更简单的方法 List
  • 无需分组即可获得最大值

    假设我有一张这样的表 name age a 1 b 2 c 3 d 4 e 5 f 6 通常 当我们选择 MAX age 时 它返回 f 6 元组 但我想要的是它应该按原样返回表 但所有年龄值都将是最大值 例如 name age a 6 b
  • 使用 Flyway 管理修补程序

    假设我有 2 个分支 Develop与迁移 V1 change1 V2 change2 V3 change3 V4 change4 V5 change5 Master迁移 部署在生产环境中 V1 change1 V2 change2 现在我
  • 如何在 jetpack compose 中显示具有适当大小/布局的垂直文本

    如何在 jetpack 中正确旋转文本并使其进行正确的布局 当我使用rotate文本对象上的修饰符会旋转文本 但布局中占用的大小似乎使用预旋转的文本宽度 这是我想要完成的一个简单示例 垂直文本应该位于狭窄空间的左侧 Composable f
  • 使用 groovy 将 ISO-8859-1 转换为 UTF-8

    我需要将 ISO 8859 1 文件转换为 utf 8 编码 而不丢失内容信息 我有一个如下所示的文件
  • 如何在 Python 中使用 AsciiDoc?

    最初的 AsciiDoc 处理器是用 python 编写的 但 AsciiDoc 演变为用 Ruby 编写的 Asciidoctor 形式 在我搜索如何处理现代 AsciiDoc Asciidoctor 方言 时 我只看到一篇文章 说有一个
  • 模块与命名空间 - 导入与需要 Typescript

    我很困惑module namespace export and import require reference用法 来自 Java 背景 有人可以简单地解释一下我何时使用什么以及什么是正确的设计 当我编写示例项目时 我觉得我搞砸了 到目前
  • XML 序列化类,具有隐藏继承成员的新属性

    我有以下抽象类结构 public abstract class Template Some properties and methods defined public abstract class Template
  • 在 bash 中将命令的输出拆分为关联数组

    输出是 ext4 boot ext2 tank zfs 每行的分隔符是一个空格 我需要一个关联数组 例如 gt ext4 boot gt ext2 tank gt zfs 这在 bash 中是如何完成的 如果命令输出在文件中file the
  • Xcode 6 gitignore 文件应包含哪些内容?

    典型的应该是什么 gitignore包含 Xcode 6 吗 另请参阅有关xccheckoutXcode 5 中引入参见here https stackoverflow com q 18340453 2158465 1 最简单的答案是我的看
  • 重新加载 JavaScript 文件而不刷新 HTML

    我有一个 HTML 它加载了几个 Javascript 文件 当我在浏览器控制台中调试 测试 Javascript 时 是否可以重新加载这些 Javascript 文件 而无需重新加载整个 HTML 页面 您可以删除然后重新添加它们 scr
  • 如何在 MS Access 的 SQL 中实现分页?

    我正在通过 ASP NET 访问 Microsoft Access 2002 数据库 MDB OdbcConnection类 尽管速度很慢 但效果很好 我的问题是关于如何在 SQL 中实现分页以查询该数据库 因为我知道我可以实现TOP子句为
  • 如何通过 Jenkins 脚本控制台设置“扫描组织触发器”?

    我需要一种通过 Jenkins 脚本控制台设置 扫描组织触发器 的方法 这很接近 但仅显示多分支或组织扫描触发器 如果它们已存在 https github com cloudbees jenkins scripts blob master
  • 在 Jetty 中从 http 重定向到 https

    我想从 http myurl 永久重定向到 https myurl 但在 Jetty 中我只找到 MovedContextHandler 用它我只能重定向上下文路径 例如从 myurl bla 到 myurl bla bla
  • 线程和执行器的正常关闭

    下面的代码试图实现这一点 该代码永远循环并检查是否有任何待处理的请求 如果有 它会创建一个新线程来处理请求并将其提交给执行器 所有线程完成后 它会休眠 60 秒 并再次检查待处理的请求 public static void main Str
  • 重写 Rust 中的总体特征实现

    对于我的游戏规则引擎 我有一个核心特征 称为Rule处理游戏回调 有两种类型Rules a BaseRule适用于游戏中的任何实体 并且CreatureRule仅适用于生物 我目前的代码结构如下 trait BaseRule