gpt4 book ai didi

使用rust "error: moving out of immutable field"

转载 作者:行者123 更新时间:2023-11-29 08:02:43 24 4
gpt4 key购买 nike

我创建了以下 Rust 结构:

struct HTTPRequestHeader {
name: ~str,
data: ~str,
next: Option<~HTTPRequestHeader>
}

和下面的代码来打印它:

fn print_headers(hdr: &HTTPRequestHeader) {
println(fmt!("%s: %s", (*hdr).name, (*hdr).data));
match (*hdr).next {
Some(next_hdr) => { print_headers(next_hdr); }
None => { }
}
}

尝试编译此代码时,出现以下错误:

> rustc http_parse.rs
http_parse.rs:37:7: 37:18 error: moving out of immutable field
http_parse.rs:37 match (*hdr).next {
^~~~~~~~~~~
error: aborting due to previous error

这是什么意思?包含 (*hdr).name, (*hdr).data) 的行编译没有错误。 match 语句不应该试图以任何方式改变 hdr.next,所以我看不出不变性是如何产生的。我试图编写一个不接受指针的修改版本:

fn print_headers(hdr: HTTPRequestHeader) {
println(fmt!("%s: %s", hdr.name, hdr.data));
match hdr.next {
Some(next_hdr) => { print_headers(*next_hdr); }
None => { }
}
}

这个给了我:

> rustc http_parse.rs
http_parse.rs:37:7: 37:15 error: moving out of immutable field
http_parse.rs:37 match hdr.next {
^~~~~~~~
http_parse.rs:38:36: 38:45 error: moving out of dereference of immutable ~ pointer
http_parse.rs:38 Some(next_hdr) => { print_headers(*next_hdr); }
^~~~~~~~~
error: aborting due to 2 previous errors

请帮助我了解这里发生了什么! :)

最佳答案

虽然错误确实告诉您尝试将值 移动到哪里,但它并不表示您尝试将它移动到 的位置,这可能会有所帮助让它更清楚为什么它不起作用。

问题是你有一个唯一的指针(Option<~HTTPRequestHeader>),这意味着你要么需要引用它,要么制作一个副本。由于它们只能有一个所有者,因此默认情况下它们会被移动。 Some(next_hdr) 中发生了什么匹配的分支。

所以你可能想要的是这样的:

fn print_headers(hdr: &HTTPRequestHeader) {
println(fmt!("%s: %s", hdr.name, hdr.data));
match hdr.next {
Some(ref next_hdr) => print_headers(*next_hdr),
None => {}
}
}

此外,附注:如果您想通过指针访问某个结构的字段,则不需要显式取消引用它(即 hdr.name(*hdr).name 一样有效)。

关于使用rust "error: moving out of immutable field",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16905004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com