如何初始化相互引用的结构体字段

2023-11-30

我目前想定义一个结构体Piston使用 GamerIterator 进行游戏:

pub struct MyGame<'a> {
    game_window: GameWindowGLFW,
    game_iter: GameIterator<'a, GameWindowGLFW>,
    //...
}

The GameIterator是通用的GameWindow及其寿命。我想告诉编译器它与字段“game_window”/“整个结构”具有相同的生命周期,并忽略结构的生命周期。

我在初始化时也遇到困难:

MyGame {
    game_window: GameWindowGLFW::new(GameWindowSettings {/*...*/},
    game_iter: GameIterator::new(&mut game_window, &game_iter_settings), // game_window cannot be used here
    //...
}

我认为我可以通过使用来解决初始化问题Option<GameIterator<...>>和 init() 方法,但我想避免这种情况,因为我可以保证game_iter存在于之后new()完成。

写这个的惯用方式是什么?


不仅存在初始化问题,还可能存在破坏问题,如果GameIterator实施的Drop:编译器必须知道它需要析构game_iter before game_window, 否则game_window会引用一个被毁坏的GameWindowGLFW运行时drop() method.

无法将结构本身的生命周期作为生命周期参数传递。你唯一能做的就是删除game_window字段来自MyGame并通过一个GameWindowGLFW实例到MyGame的初始化器。如果你想封装它以便用户不需要创建GameWindowGLFW,您可以编写一个方法来创建GameWindowGLFW and a MyGame在堆栈上并调用一个接受的闭包MyGame仅论据。

pub struct MyGame<'a> {
    game_iter: GameIterator<'a, GameWindowGLFW>,
    //...
}

impl<'a> MyGame<'a> {
    fn new(game_window: &'a mut GameWindowGLFW) -> MyGame<'a> {
        MyGame {
            game_iter: GameIterator { game_window: game_window },
        }
    }
}

fn start_game(callback: |game: &mut MyGame|) {
    let mut game_window = GameWindowGLFW;
    let mut game = MyGame::new(&mut game_window);
    callback(&mut game);
}

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

如何初始化相互引用的结构体字段 的相关文章

  • 有没有一种方法可以设计一个特征,允许任何类型实现它,即使实现者既不拥有该类型也不拥有该特征?

    一般情况下 假设 C1 C2 C3 不同 则不可能在包 C1 中实现包 C3 中定义的类型的 C2 中定义的特征 但是有没有什么技巧可以故意设计一个特征 以便允许这样的实现呢 自 Rust 1 41 以来 Rust 的孤儿规则似乎更加宽松
  • 无法移出借用内容/无法移出共享引用后面

    我不明白这个错误cannot move out of borrowed content 我收到过很多次了 每次都解决了 但一直不明白为什么 例如 for line in self xslg file iter self buffer cle
  • 检查 Option 是否包含特定 Some 值的最佳方法?

    您不能执行以下操作 if option is some option 1 既然如果option is some false第二次比较会出错 做这样的事情的最好方法是什么 我现在正在做什么 if option is some if optio
  • 如何避免在 Rust 中使用标准输入换行

    我有这个代码 fn main let mut stdin io stdin let input mut String new loop input clear print Your age stdin read line input pri
  • 如何指定 AsRef 的生命周期?

    我正在尝试编写一个函数来连接两个可迭代对象 其项目可以转换为OsStr引用 并且在尝试指定引用的生命周期时遇到了巨大的困难 use std convert AsRef use std ffi OsStr use std marker Pha
  • 从向量获取特征对象引用

    我正在努力从 a 中获取元素Vec这是一生的参考 我将我的代码简化为 pub trait Runnable pub struct RunList lt a gt runnables Vec lt a mut Runnable gt impl
  • 如何固定板条箱的间接依赖关系?

    我的项目 A 依赖于库 B 而库 B 又依赖于库 C 库 B 将依赖版本设置为 任何 所以 Cargo 将下载最新版本的 C 我如何指示 Cargo 使用特定版本的库 C 构建库 B 我正在尝试建立iron https github com
  • for 循环和 into_iter() [重复]

    这个问题在这里已经有答案了 据我了解 for循环隐式调用into iter 在向量上循环遍历它 但是 在下面的代码中 为什么vec在 Question1 1 的第一个 for 循环中没有消耗 但在第二个 for 循环中 vec 消耗了 fn
  • 如何限制Cargo.toml中的测试线程数?

    我的测试共享公共资源并且无法同时执行 这些测试失败cargo test 但与RUST TEST THREADS 1 cargo test 我可以修改测试以等待全局互斥体 但如果有任何更简单的方法来强制 我不想让它们混乱cargo为我设置这个
  • 对向量的引用仍然打印为向量?

    愚蠢的 n00b 试图了解一点 Rust 这是我的程序 fn main let v vec 1 2 3 println v println v 产生输出 1 2 3 1 2 3 重点是什么 我一半期待它打印一个内存地址 我最初是被这个抛出的
  • 警告功能默认情况下应该有一个蛇形标识符

    我试图弄清楚这个警告的实际含义 该程序运行完美 但在编译过程中我收到此警告 main rs 6 1 8 2 warning function isMultiple should have a snake case identifier wa
  • 重新分配可变变量时是否调用析构函数?

    假设我定义了一个可变变量 它可能是一些复杂的结构 其中包含向量或其他动态分配的数据Drop特征 重新分配该变量时 析构函数是否在重新分配后立即调用 let mut x some complex struct while some condi
  • 了解特征和对象安全

    我正在努力学习对象安全的基础知识 如果我有这个代码 struct S x i32 trait Trait Sized fn f self gt i32 where Self Sized fn object safety dynamic x
  • 强制 io::stdio 和 BufReader 之间的 BufRead 特征兼容性

    我正在尝试输入双关语io stdio实例和一个BufReader包装一个文件 以便我可以编写假设缓冲输入源的代码 我尝试了几种尝试投射的变体io stdio to a BufRead类型和所有都因以下一种或多种变体而失败 error mis
  • 为什么在闭包参数中使用“&&”?

    我有两个问题这个例子 https doc rust lang org std iter trait Iterator html method find let a 1 2 3 assert eq a iter find x x 2 Some
  • 为什么 String 不实现 From<&String>?

    背景 我知道 Rust 人们更喜欢 str而不是 String 但在某些情况下我们只得到 String 一个例子是当你打电话时std iter Iterator peekable 返回值是一个Peekable i 将原始迭代器包装到其中并为
  • 如何将 take_while 与 future::Stream 一起使用?

    我想了解我应该使用什么语法take while https docs rs futures 0 1 futures stream trait Stream html method take while with futures Stream
  • 如何对另一个数字进行模运算而不溢出?

    我正在尝试为 Rust 实现快速素性测试u32 and u64数据类型 作为其中的一部分 我需要计算 n n d where n and d are u32 or u64 分别 虽然结果可以很容易地适合数据类型 但我不知道如何计算它 据我所
  • Box、ref、&、*的理解及关系

    我对 Rust 中的指针如何工作有点困惑 有ref Box 而且我不确定他们如何一起工作 目前我的理解是这样的 Box并不是真正的指针 它是一种在堆上分配数据并在函数参数中传递未调整大小的类型 尤其是特征 的方法 ref在模式匹配中用于借用
  • Rust 元组参考和参考元组

    元组引用和作为类型引用的元组之间有什么关系 为什么第一个有效但第二个不行 let a 1 let b 2 This works c i32 d i32 let c d a b type TupleOfRef lt a gt a i32 a

随机推荐

  • 在 google go 中使用 olivere/elastic 更新 ElasticSearch 中的记录

    我正在使用 go 在弹性搜索中插入一条记录 如下所示 https github com olivere elastic现在 如果我必须部分更新它 假设只有一个条目 如 名称 那么我想使用 UPDATE API 我找不到任何描述如何在 oil
  • JSF RichTable 合并标题中的行/列

    我想做的是做这个布局RichTable在其标题中有 3 列 3 5 1 2 4 6 我已经习惯了this 8 2 完成任务的资源 富脸4 0 0 但相反 我最终得到了没有任何合并的普通表行 您能解释一下吗 Update 关于来自的答案瓦西尔
  • 多个组件 - 性能损失?

    我有一个清单System IO Ports SerialPort一个程序集中的对象 并且我计划处理来自另一个程序集的 Data Receieved 事件 我想知道这是否会以某种方式影响性能 会吗 恐怕我不太清楚 CLR 如何管理程序集 谢谢
  • 从 VS 05 中的资源设置应用程序图标

    我知道我可以将图标添加到项目的 Resources resx 文件中 然后从代码中引用该图标 如何从资源中设置整个EXE的图标 我所看到的只是浏览另一个文件的地方 我想使用我的资源中的当前图标文件 而不必在我的项目中拥有重复的文件 than
  • 如何将两个独立但相似的代码库合并到一个 SVN 代表中?

    I have www example com 上的 var www cool codebase 并且我有 www example net 上的 var www cool codebase 代码库适用于在不同服务器上运行的同一 Web 应用程
  • 将 nil 排序到可选字符串数组的末尾

    如果我有一个可选字符串数组 并且我想以 nils 开头按升序对它进行排序 我可以在一行中轻松完成 b nil a sorted 0 lt 1 nil a b 但似乎没有任何类似简单的解决方案可以将 nil 排序到end数组的 使用大多数其他
  • 是否有 Visual Studio 插件的配置类型文件?

    创建 Visual Studio 加载项时 如何利用该加载项的 app config 如果我向项目添加一个并部署它 那么当加载项运行并且我以编程方式尝试通过 ConfigurationManager AppSettings 访问它时 它不会
  • xargs 在搜索中尊重通配符

    我有一个名为 file1 txt 的文件 dir1 dir2 dir3 我想使用 xargs 检查某些文件是否存在于文件系统中 如下所示 cat file1 txt xargs i ls projects analysis7 meta bw
  • IHttpContextAccessor.HttpContext.User.Identity 显示 CurrentUserService 服务中的所有 null 属性

    我正在尝试使用Jason Taylor 的简洁架构模板 这个模板使用 NSwag 自动创建 TypeScript 客户端 Angular 但我不需要创建 TS 客户端 所以我的主要目标是用 Razor Pages 替换它 我已经能够取得高分
  • Cocoa:每次方法调用都会中断?

    通常 在调试时 了解以什么顺序调用类的哪些方法对我来说很重要 天真的解决方案 到目前为止我一直在使用 是弹出一个NSLog在每个方法的顶部 但这是耗时的 重复的 丑陋的 并且如果我在调试后忘记删除日志 会让我的代码看起来很幼稚 一个更干净的
  • Toast 不从列表中选定的项目生成文本

    我在android中用列表视图制作了一个简单的应用程序 因为我想在选择一个项目时进行吐司 我已经尝试如下 但它不起作用 我的代码如下 main java package com example listview import java ut
  • ZF2 骨架应用程序抛出 500 错误

    当尝试使用以下命令部署骨架应用程序时 git clone git github com zendframework ZendSkeletonApplication git cd ZendSkeletonApplication php com
  • 将数组传递给 useEffect 依赖项列表

    每 5 秒长轮询会产生一些数据 我希望我的组件在每次数组的一项 或数组长度本身 发生变化时调度一个操作 在将数组作为依赖项传递给 useEffect 时 如何防止 useEffect 进入无限循环 但如果任何值发生变化 仍然设法调度一些操作
  • 运算符和方法之间的区别

    运算符和方法之间有本质区别吗 我看到的唯一区别是它们的调用方式 它们还有其他区别吗 例如在Python中连接 切片 索引被定义为运算符 而 指字符串 upper replace strip 等等都是方法 如果我正确理解问题 简而言之 一切都
  • Python pygame 未安装

    C Users matth gt pip3 安装 pygame 收集pygame 使用缓存的 pygame 2 1 2 tar gz 10 1 MB 准备元数据 setup py 错误 错误 子进程退出并出现错误 python setup
  • Javascript 和 RegEx:分割​​并保留分隔符

    我有一个正则表达式 它将把我的字符串分割成数组 一切工作正常 除了我想保留分隔符的一部分 这是我的正则表达式 a zA Z0 9 s 在 JavaScript 中 我正在做 var test paragraph split a zA Z0
  • 有没有办法使用 ServiceTask 在控制台应用程序中托管 Razor 页面?

    我正在尝试创建一个控制台应用程序来公开 JSON 服务 另外我想托管 html 和 js 页面来使用它们 我将 md 甚至 htm 文件放入 Views 文件夹中 但我无法访问它们 如果我添加一条路线 Add Test 其中 MyMarkd
  • 46 个 SQL 加载程序的控制文件

    我必须使用 SQL Loader for Oracle 加载 46 个表的数据 所有数据文件均为 CSV CSV 中的列顺序与表中的列顺序匹配 我需要为每个表创建一个控制文件 我批量生产这些文件的最佳方法是什么 我知道这是一个老问题 但它仍
  • Android DexClassLoader 错误,“优化数据目录..不属于当前用户”

    我正在尝试生成一个简单的 Android 应用程序 可以在运行时从 SD 卡加载 DEX 文件 该应用程序有两个活动 第一个活动是一个带有按钮的简单屏幕 当按下按钮时 将启动第二个活动 从而调用 loadDex 方法 loadDex 方法尝
  • 如何初始化相互引用的结构体字段

    我目前想定义一个结构体Piston使用 GamerIterator 进行游戏 pub struct MyGame lt a gt game window GameWindowGLFW game iter GameIterator lt a