为什么编译器会警告未初始化的变量,即使我已经分配了该变量的每个字段?

2023-12-11

我完全分配了字段MyStruct实例名为x在比赛的每一个可能的括号中:

enum MyEnum {
    One,
    Two,
    Three,
}

struct MyStruct {
    a: u32,
    b: u32,
}


fn main() {
    f(MyEnum::One);
    f(MyEnum::Two);
    f(MyEnum::Three);
}

fn f(y: MyEnum) -> MyStruct {
    let mut x: MyStruct;

    match y {
        MyEnum::One => {
            x.a = 1;
            x.b = 1;
        }
        MyEnum::Two => {
            x.a = 2;
            x.b = 2;
        }
        MyEnum::Three => {
            x.a = 3;
            x.b = 3;
        }
    }

    x
}

为什么编译器会返回以下错误?

error[E0381]: use of possibly uninitialized variable: `x`
  --> src/main.rs:37:5
   |
37 |     x
   |     ^ use of possibly uninitialized `x`

我认为这是一个已知问题(另请参阅其相关问题)。


let x: MyStruct;没有设置x为空值,它声明一个变量。您仍然需要为其分配一个值。

fn f(y: MyEnum) -> MyStruct {
    let x;

    match y {
        MyEnum::One => {
            x = MyStruct { a: 1, b: 1 };
        }
        MyEnum::Two => {
            x = MyStruct { a: 2, b: 2 };
        }
        MyEnum::Three => {
            x = MyStruct { a: 3, b: 3 };
        }
    }

    x
}

换句话说,let x;创建一个未绑定变量,即没有关联值的变量。因此您需要稍后为其绑定一些值。

如果您只想从函数返回一个值,则可以利用以下事实:Rust 中几乎每个语句都会产生一个值,并且最后一个语句的值是函数的返回值。

fn f(y: MyEnum) -> MyStruct {
    use MyEnum::*;

    let x = match y {
        One   => MyStruct { a: 1, b: 1 },
        Two   => MyStruct { a: 2, b: 2 },
        Three => MyStruct { a: 3, b: 3 },
    };
    x
}

也可以彻底消除x,如果你这样选择的话。

fn f(y: MyEnum) -> MyStruct {
    use MyEnum::*;

    match y {
        One   => MyStruct { a: 1, b: 1 },
        Two   => MyStruct { a: 2, b: 2 },
        Three => MyStruct { a: 3, b: 3 },
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么编译器会警告未初始化的变量,即使我已经分配了该变量的每个字段? 的相关文章

随机推荐

  • Oracle - 修改现有表以自动增加列

    我有一个包含以下列的表 NOTEID NUMBER NOT NULL 出于所有意图和目的 此列是主键 该表有几千行 每行都有一个唯一的 ID 以前 应用程序会从表中 SELECT MAX 值 加一 然后将其用作下一个值 这是一个可怕的解决方
  • Android Studio ActionBar 宽度/图标位置

    I have a problem with my ActionBar that results in my menu icon being pressed up against the edge of the screen 下面是我调整过的
  • 从价格中删除无效字符

    我有一个场景 我必须使用 C 从价格字符串中删除某些字符 我正在寻找一个正则表达式来删除这些字符或比这更好的东西 例如 如果价格字符串是 3 950 000 Ex TAX 我想删除 Ex TAX 从字符串中 基本上我必须从字符串中删除除数字
  • v-for prop 值未通过引导模式更新

    我有以下代码片段 div class list group item media div
  • 计算在 Apple 地图中完成旅程所需的时间

    我正在 MKMapView 上工作以获取两个位置之间的方向 有什么方法可以获取完成此旅程所需的时间 是否有任何内置属性MKRoute or MKDirection可以为我提供时间来完成这段旅程的课程吗 任何帮助 将不胜感激 谢谢 维卡斯 Y
  • 将 2D 数组复制到已知可变宽度的 GPU

    我正在研究如何将每行可变宽度的 2D 数组复制到 GPU 中 int rows 1000 int cols int host matrix malloc sizeof int rows int d array int length Each
  • Apache:如何在 Alias 中使用重写引擎

    我有这个别名配置 Alias test D WWW Test
  • 从经过身份验证的站点获取文件(使用 python urllib、urllib2)

    我正在尝试从网站获取查询的 Excel 文件 当我输入直接链接时 它将进入登录页面 输入用户名和密码后 它将自动下载 Excel 文件 我试图避免安装不属于标准 python 的附加模块 该脚本将在 标准化机器 上运行 如果未安装该模块 它
  • C/C++ 中的“@”和“$”代表什么? [复制]

    这个问题在这里已经有答案了 到目前为止 在 MinGW 中 似乎只是一个基本字符 如 a 可以在名称 变量 函数等 中使用 但它看起来并不像一个 使用 作为我缺少的名称的一部分是否有一些隐藏功能 int m 2 printf m i m 控
  • 三指针数组的 C# 包装器

    我目前正在开发一个 C 包装器 以便与 Dallmeier Common API light 一起使用 请参阅之前的帖子 C 包装器和回调 我几乎已经 包装 了所有内容 但我坚持包装一个回调 其中包含一个由三个指针组成的数组和一个数组整数
  • 更新文件或文件夹修改日期

    当文件和文件夹从一个位置复制到另一个位置时 我需要更新文件和文件夹的 修改日期 属性 以便 修改日期 当前系统时间 我有一台装有 Windows 7 的电脑 但我没有管理权限 因此无法安装任何自定义实用程序 我当前的bat文件使用XCOPY
  • EF4 生成数据库

    我正在尽最大努力寻找最简单的方法来创建基本的 模型优先 实体框架示例 然而 我正在努力解决数据库的实际生成问题 特别是针对数据库运行 SQL Tools 视觉工作室2010 SQL Server 2008 Express Process 创
  • 如何在 dart 构建中启用 --enable-experimental-mirrors?

    我的项目构建失败了 因为它们依赖于镜像 而 dart build out put 告诉我使用 enable experimental mirrors尝试在 dart2js 代码中按原样使用镜像 所以如果我跑pub build enable
  • 通过线性布局移动图像

    我正在开发一个 Android 2 2 应用程序 我想将图像从屏幕左侧移动到屏幕右侧 我怎样才能做到这一点 我读到我必须将此图像添加到 ListView 或 GridView 才能设置此动画 UPDATE我创建了以下文件 动画 transl
  • 为什么使用 PosixFilePermission 设置目录权限不起作用

    下面是我的代码 String DirectoryPath Users xxx uploads image Path newDirectoryPath Paths get DirecotryPath if Files exists newDi
  • 如何将条件变量对象插入向量?

    conditional variable 不是可复制构造 可移动构造 可复制分配 可移动分配 我们可以这样打电话吗 vector
  • 确定具有 NA 的行数

    我有一个数据框如下 col1 col2 col3 1 23 17 NA 2 55 NA NA 3 24 12 13 4 34 23 12 我有兴趣查找带有 NA 的 col2 和 col3 中的行数 我很惊讶下面的代码只给了我 4 而不是
  • 空格、换行符、制表符;它们会影响服务器性能吗?

    空格 换行符 制表符 它们会影响服务器性能吗 我正在学习 PHP 的路上 在进一步采用当前的编码风格之前 我想确保 换行符和空格是否会影响服务器的性能 通常 我总是添加它们以提高可读性 例如在下面的代码中 import something
  • 如何在不重新加载页面的情况下更改 Firefox window.location.hash? [复制]

    这个问题在这里已经有答案了 我在 URL 片段中存储一些状态信息 哈希 无论你怎么称呼它 当我改变window location hash在 Chrome 和 Safari 中 页面不会重新加载 这是我想要的行为 当我改变时window l
  • 为什么编译器会警告未初始化的变量,即使我已经分配了该变量的每个字段?

    我完全分配了字段MyStruct实例名为x在比赛的每一个可能的括号中 enum MyEnum One Two Three struct MyStruct a u32 b u32 fn main f MyEnum One f MyEnum T