我可以在 Rust 中定义一个带有自身类型参数的特征吗?

2024-03-28

我是 Rust 新手,在处理特征和泛型方面遇到困难。我首先定义一个特征来为我做一些工作,然后定义一个将其用作类型参数的通用结构。现在我意识到,在原始特征中,我实际上想使用我定义的结构,所以我处于一种循环中。我不知道如何摆脱它,并且想知道我想要的东西是否可以通过泛型实现,或者也许我需要使用拳击或其他一些方法?下面的最小示例。

这就是我最初的开始:

trait Worker {
  fn work() -> WorkResult;
}

struct WorkResult {
  result: u64;
}

接下来,我意识到我想让一个工作人员处理结果,这样我就可以惰性地生成该值并使用各种工作人员实现。

trait Worker {
  fn work() -> WorkResult;
}

struct WorkResult<T> where T: Worker {
  result: u64;
  worker: T;
}

这就是事情开始变得奇怪的地方Worker trait. WorkResult现在需要一个类型参数,但它在特征中是未知的。我尝试了很多不同的方法,但无法让编译器喜欢它。

Attempt:

trait Worker<T> where T: Worker {
  fn work() -> WorkResult<T>;
}

struct WorkResult<T> where T: Worker {
  result: u64;
  worker: T;
}

那根本不起作用。编译器甚至无法识别该参数:

error[E0107]: wrong number of type arguments: expected 1, found 0

我无法在这里插入任何具体类型(而且我认为我不必这样做)。这里有什么办法可以实现我想要的吗?


这里的问题是Worker即使用作边界,特征也需要类型参数,因此您需要编写where T: Worker<U>.

不幸的是,在特征定义的情况下,这将变得递归。例如,如果您这样做:

trait Worker<T> 
    where T: Worker<U>,
{...}

然后,您需要向工作人员添加第二个通用参数,这将需要第三个,依此类推。另一种可能性,where T: Worker<T>从技术上讲是可以编译的,但它使得该特征不可能(或者至少超出了我的能力)成功实现。

一种可能的解决方案是将类型参数移至work函数,就像这样:

trait Worker {
    fn work<T: Worker>() -> WorkResult<T>;
}

struct WorkResult<T: Worker> {
    result: u64,
    worker: T,
}

(注意struct WorkResult<T: Worker>只是简写struct WorkResult<T> where T: Worker)

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

我可以在 Rust 中定义一个带有自身类型参数的特征吗? 的相关文章

随机推荐

  • 如何设置AlertDialog中正负按钮的顺序?

    为什么我要这样做完全是另一个讨论 但我需要找出使我的所有警报对话框在右侧都有肯定按钮的最佳方法 请注意 在 3 0 及更低版本中 按钮通常显示为 确定 取消 而在 4 0 及更高版本中 按钮通常显示为 取消 确定 我想强制我的应用程序以最简
  • Xcode:在每次构建之前运行直接修改源代码的脚本

    我做了什么 我有一个脚本 阅读一些配置文件来生成源代码片段 找到相关的 Objective C 源文件并 将源代码的某些部分替换为步骤 1 中生成的代码 和一个 Makefile 它有一个特殊的时间戳文件作为 make 目标 配置文件作为目
  • Bash:循环直到命令退出状态等于 0

    我在本地计算机上安装了 netcat 并在端口 25565 上运行了一个服务 使用以下命令 nc 127 0 0 1 25565 lt dev null echo Netcat 检查端口是否打开 如果打开则返回 0 如果关闭则返回 1 我正
  • 如何理解 JavaScript 中的 isEqualNode()

    我试图理解 JavaScript 中的 isEqualNode 方法 显然根据 W3 学校提供的定义是这样的 isEqualNode 方法检查两个节点是否相等 如果满足以下所有条件 则两个节点相等 它们具有相同的节点类型 它们具有相同的no
  • HTML5 Websockets 可以在不使用服务器的情况下直接连接 2 个客户端(浏览器)吗? (P2P)[重复]

    这个问题在这里已经有答案了 使用 HTML5 Websockets 我可以直接在 2 个客户端 浏览器 之间打开套接字 假设我知道它们的 IP 地址并且不存在 NAT 遍历问题 我想将一些数据直接从一个浏览器发送到另一个浏览器 本质上是创建
  • 扩展内置集合,内置方法的问题

    我是 Scala 新手 所以请原谅我 如果这是一个愚蠢的问题 但这里是 想象一下 我希望创建一个包含附加方法的扩展 Map 类型 我可以看到几种方法来做到这一点 第一个是组合 class Path V val m Map V Int Def
  • Python multiprocessing.Pool:AttributeError

    我在一个类中有一个方法 需要在循环中完成大量工作 我想将工作分散到我的所有核心上 我写了下面的代码 如果我使用正常的话 它可以工作map 但与pool map 返回错误 import multiprocessing pool multipr
  • IPython笔记本:如何重新加载特定Python文件中的所有模块?

    我在一个文件中定义了许多模块 并添加from myFile import 到我的 ipython 笔记本的第一行 以便我可以将它用作该笔记本中其他部分的依赖项 目前我的工作流程是 modify myFile 重启Ipython内核 重新运行
  • OWL 限制 - 定义仅包含具有特定属性值的属性的类

    我目前正在玩 OWL 尤其是有限制的情况 我正在尝试创建一个执行以下操作的查询 假设我有一个类 Cinema 它具有属性 movies 包含 Movie 类型的对象 Movie 类包含一个名为 genre 的属性 现在我想创建一个 Acti
  • 如何自动设置跨度计数和图标大小

    我正在使用回收器视图和卡片视图来显示应用程序中的图标 我无法弄清楚如何调整应用程序图标的大小并根据屏幕尺寸自动增加 减少跨度计数 这是我正在做的显示它的操作 并且花费计数固定为 3 RecyclerView mrv RecyclerView
  • 使用 ASCII/拉丁字符集是否可以加快数据库速度?

    看起来 对大多数字段使用 ASCII 字符集 然后仅对需要它的字段指定 utf8 可以将数据库必须执行的 I O 量减少 100 有人知道这是真的吗 更新 以上并不是我的问题 我应该说 使用拉丁语作为默认字符集 然后只为需要它的字段指定 u
  • 尝试管理共享公共基类的多个类时出现 Spring 错误?

    我目前使用 Spring 3 0 x 我想知道这些结构有什么问题 我想管理子类而不是父类 我有 2 个子 DAO 扩展了 BaseDAO public abstract class BaseDAO
  • 如何让VBox填充其父级的大小

    这是使 VBox 填充其父级的正确方法吗 final Group root new Group final Scene scene new Scene root 1000 800 Color BLACK final VBox c new V
  • WCF @ServiceHost 调试=“true”但 web.config 编译=“false”

    我一直在查看 MSDN 文档 但没有找到具体的答案 ServiceHost 中的 Debug 属性是否会覆盖 Web config 的编译属性 还是 web config 属性会覆盖所有属性 Thanks 根据 http msdn micr
  • 将多条记录合并到表中的一行中

    我有一个表 其中有多个相同销售代理 ID 但不同销售额的记录 如何删除多行并仅获得总值的聚合 例如 我们假设表结构如下 SalesAgentId SalesAgentName SalesAmount 111 John Doe 8437 00
  • 使用可传输对象调用 postMessage 时,MessageChannel port.postMessage 的数据为空?

    我正在学习关于消息通道 http dev opera com articles view window postmessage messagechannel channel and 可转让物品 https developer mozilla
  • HABTM 连接表上需要两个索引吗?

    一个简单的has and belongs to many协会 Person has and belongs to many products Product has and belongs to many persons Are both以
  • MySQL:如果外键存在则插入

    我有一个包含大约 2000 行的 Excel 工作表 我想将其插入到数据库中 问题是我想要插入 2 000 行的表有一列引用了另一个表中的外键 不幸的是 许多查询失败 因为提供的外键值不存在 我知道我可以忽略外键检查 但这不是我想要的 我不
  • 在地图上绘制坐标

    我正在尝试使用 R 绘制我的坐标 我已经尝试遵循不同的帖子 R 在世界地图上绘制分组坐标 https stackoverflow com questions 16234092 r plot grouped coordinates on wo
  • 我可以在 Rust 中定义一个带有自身类型参数的特征吗?

    我是 Rust 新手 在处理特征和泛型方面遇到困难 我首先定义一个特征来为我做一些工作 然后定义一个将其用作类型参数的通用结构 现在我意识到 在原始特征中 我实际上想使用我定义的结构 所以我处于一种循环中 我不知道如何摆脱它 并且想知道我想