在Rust中借用检查器和函数参数,正确还是过度热心?

时间:2017-01-02 03:43:34

标签: rust borrow-checker

当一个可变参数作为函数参数传递时,借用检查器不允许使用它来构造其他参数,即使这些参数克隆值而不保留引用。

虽然在函数之外分配变量总是一个选项 1 ,但从逻辑上讲,这似乎过于热心,而借用检查员可以考虑这一点。

这是按预期工作还是应该解决的问题?

#[derive(Debug)]
struct SomeTest {
    pub some_value: f64,
    pub some_other: i64,
}

fn some_fn(var: &mut SomeTest, other: i64) {
    println!("{:?}, {}", var, other);
}

fn main() {
    let mut v = SomeTest { some_value: 1.0, some_other: 2 };
    some_fn(&mut v, v.some_other + 1);

    // However this works!
/*
    {
        let x = v.some_other + 1;
        some_fn(&mut v, x);
    }
*/
}

给出了这个错误:

  --> src/main.rs:14:21
   |
14 |     some_fn(&mut v, v.some_other + 1);
   |                  -  ^^^^^^^^^^^^ use of borrowed `v`
   |                  |
   |                  borrow of `v` occurs here

请参阅:playpen

[1]:尽管一次性赋值确实有时会提高可读性,但强制使用它们作为参数会鼓励使用范围来避免单个使用变量污染名称空间,导致函数调用本来就是一行 - 被括在括号中并定义变量......如果可能的话,我想避免这种情况,特别是当需求似乎是借用检查器可以支持的东西时。

1 个答案:

答案 0 :(得分:4)

这是借阅检查器当前实现的工件。这是一个众所周知的限制,可以追溯到至少 2013,没有人喜欢它。

  

这是否按预期工作

  

应该解决的问题?

神奇的关键词是"非词汇生命周期"。现在,生命周期是词汇 - 它们对应于我们输入的源块。理想情况下,foo.method(foo.mutable_method())会看到借用在括号内结束"但由于种种原因,它与整个陈述相关联。

有关更多信息,请参阅RFC issue 811以及从那里链接的所有内容。