rust - 移动原始实例后不反映使用字段的可变引用的更改
问题描述
我试图通过从它的实例中借用一个可变引用来操纵x
结构的字段。Foo
foo
如果我在原始实例移动后尝试使用实例的移动绑定打印该字段,x
它会继续打印未更改的值。y
foo
下面的简化示例:
struct Foo {
x: i32,
}
fn main() {
let mut foo = Foo { x: 42 };
let x = &mut foo.x;
*x = 13;
let y = foo;
println!("{}", y.x); // -> 42; expected result: 13
}
相反,如果我打印移动的绑定y
本身,它会打印更改的值。
println!("{:?}", y); // -> Foo { x: 13 }
或者,如果我在移动之前x
或foo.x
之前打印其他内容,它会按预期打印内容。
println!("{}", x); // -> 13
let y = foo;
println!("{}", y.x); // -> 13
这是预期的行为吗?
解决方案
这是编译器中的一个已知错误,仅影响 rustc 1.45。rustc 1.44 不受影响,该问题已在 Beta 版上得到修复,这意味着它将在 rustc 1.46 上得到修复。
已打开一个问题来跟踪它。
虽然这个问题看起来很关键,但根据oli-obk(rustc 的主要贡献者之一),它不太可能在实际代码中找到,尤其是在const
表达式中:
该错误几乎不可能在现实世界的代码中触发。您需要进入错误的所有值都是常量值,并且两者之间不能有任何控制流或函数调用。
版本 1.45.1已发布,其中包含来自 beta 的修复的反向移植等。后来的1.45.2版本发布了更多(不相关的)修复。
推荐阅读
- python - 从 Dockerfile 运行 gunicorn 不起作用,但可以手动启动
- visual-studio - Ionic cordova 构建窗口抛出 *MSBUILD* 错误
- javascript - 如何将 4 个字符串值从 HTML 页面传递到 javascript 文件?
- orbeon - 将表单导出到 xsd 文件而不会丢失每个元素类型
- c# - 是否有任何可能的方法可以在 AMP 页面加载时添加模式弹出窗口
- sql - 如何制作一个将“SELECT * FROM SOME_TABLE”之类的代码作为输入并返回表作为输出的函数?
- vb.net - 如何在数据集中的表上设置主键
- c# - 很多带有代理的实例 HttpClient
- r - R:有效地创建一个矩阵,其条目的列和行索引的最大值
- php - 换行、换行和回车的正则表达式