【发布时间】:2015-08-10 10:55:11
【问题描述】:
我作为可变引用传递的结构存在问题。仅当将结构定义为保存引用时才会出现此问题。
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)
【问题讨论】:
标签: rust