gpt4 book ai didi

rust - 关于可变内部引用的 Rust 借用规则是什么?

转载 作者:行者123 更新时间:2023-11-29 07:53:42 25 4
gpt4 key购买 nike

我不明白为什么像这样的程序

#[derive(Debug)]
struct Test {
buf: [u8; 16],
}

impl Test {
fn new() -> Test {
Test {
buf: [0u8; 16],
}
}

fn hi(&mut self) {
self.buf[0] = 'H' as u8;
self.buf[1] = 'i' as u8;
self.buf[2] = '!' as u8;
self.print();
}

fn print(&self) {
println!("{:?}", self);
}
}

fn main() {
Test::new().hi();
}

编译和运行没有任何问题,但是像这样的程序

#[derive(Debug)]
enum State {
Testing([u8; 16]),
}

#[derive(Debug)]
struct Test {
state: State,
}

impl Test {
fn new() -> Test {
Test {
state: State::Testing([0u8; 16]),
}
}

fn hi(&mut self) {
match self.state {
State::Testing(ref mut buf) => {
buf[0] = 'H' as u8;
buf[1] = 'i' as u8;
buf[2] = '!' as u8;
self.print();
},
}
}

fn print(&self) {
println!("{:?}", self);
}
}

fn main() {
Test::new().hi();
}

编译时出错,错误为

error[E0502]: cannot borrow *self as immutable because self.state.0 is also borrowed as mutable

因为这两个程序基本上做同样的事情,所以从内存的角度来看,第二个似乎不会更不安全。我知道一定有一些关于借用和范围界定规则的东西我一定遗漏了,但不知道是什么。

最佳答案

为了使您的 hi 函数正常工作,您只需将 print 移出其 match 中引入的可变借用范围表达式:

fn hi(&mut self) {
match self.state {
State::Testing(ref mut buf) => {
buf[0] = 'H' as u8;
buf[1] = 'i' as u8;
buf[2] = '!' as u8;
},
}
self.print();
}

由于在第二种情况下存在 match block ,所以您的两个变体不等价。我不知道如何在没有模式匹配的情况下直接访问 enum 中的元组结构(或者如果现在可能的话),但如果是这样的话,那么实际上不会差别很大,两个版本都可以。

关于rust - 关于可变内部引用的 Rust 借用规则是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41645402/

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