我在使用一个可变引用传递的结构体时遇到了问题。当该结构体被定义为持有引用时才会出现此问题。
struct Global<'a> {
one: i32,
two: &'a i32
}
fn do_task<'a, F, R: 'a>(global: &'a mut Global<'a>, task: F)
where F: Fn(&'a mut Global<'a>) -> &'a R {
let result = task(global);
}
fn one<'a>(global: &'a mut Global<'a>) -> &'a i32 {
&global.one
}
fn two<'a>(global: &'a mut Global<'a>) -> &'a i32 {
global.two
}
fn main() {
let number = 2;
let mut global = Global {
one: 1,
two: &number
};
do_task(&mut global, one);
do_task(&mut global, two);
}
借用检查器报告如下错误:
error: cannot borrow `global` as mutable more than once at a time
do_task(&mut global, two);
^~~~~~
note: previous borrow of `global` occurs here; the mutable borrow prevents subsequent moves, borrows, or modification of `global` until the borrow ends
do_task(&mut global, one);
^~~~~~
note: previous borrow ends here
fn main() {
...
}
^
但是,如果我更改代码,使得字段two
不再是一个引用,就像下面的例子一样,那么它就通过了。
struct Global {
one: i32,
two: i32,
}
fn do_task<'a, F, R: 'a>(global: &'a mut Global, task: F)
where F: Fn(&'a mut Global) -> &'a R {
let result = task(global);
}
fn one<'a>(global: &'a mut Global) -> &'a i32 {
&global.one
}
fn two<'a>(global: &'a mut Global) -> &'a i32 {
&global.two
}
fn main() {
let mut global = Global {
one: 1,
two: 2
};
do_task(&mut global, one);
do_task(&mut global, two);
}
我尝试用另一个作用域包围do_task
函数调用,但没有效果。
为什么引用会将可变借用延伸到main的末尾,有没有什么方法可以避免这种情况?
我使用的是rustc 1.0.0 (a59de37e9 2015-05-13) (built 2015-05-14)
for<>
语法的文档链接吗?我在书籍、参考资料和RFC中都找不到相关内容。 - Dale