【发布时间】:2017-01-14 00:20:16
【问题描述】:
我不明白为什么会有这样的程序
#[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();
}
编译时出错,错误为
错误[E0502]:不能将
*self借用为不可变的,因为self.state.0也被借用为可变的
由于这两个程序基本上做同样的事情,从内存的角度来看,第二个程序似乎不会更不安全。我知道我必须缺少一些关于借用和范围规则的东西,但不知道是什么。
【问题讨论】:
标签: rust