【问题标题】:Idiomatically access an element of a vector mutably and immutably惯用地以可变和不可变的方式访问向量的元素
【发布时间】:2016-02-22 02:01:26
【问题描述】:

您将如何对向量进行变异,以使您需要对所述向量的不可变引用来确定您需要如何对向量进行变异?例如,我有一段看起来像这样的代码,我想复制向量的最后一个元素:

let mut vec: Vec<usize> = vec![123, 42, 10];
// Doesn't work of course:
vec.push(*vec.last().unwrap())
// Works, but is this necessary?
let x = *vec.last().unwrap();
vec.push(x);

【问题讨论】:

    标签: rust borrow-checker


    【解决方案1】:

    不可变引用 [...] 来确定您需要如何改变向量?

    简短的回答是你没有。向量的任何突变都可能可能使所有现有引用无效,使任何未来的操作访问无效数据,从而可能导致段错误。 Safe Rust 不允许这种可能性。

    您的第二个示例创建了向量中值的副本,因此向量发生了什么不再重要;该值将继续有效。

    第一个示例的不幸之处在于,如果您遵循操作顺序,人类可以判断在突变发生之前检索了不可变值。事实上,这就是为什么多语句版本是可能的!这确实是 Rust 借用检查器的当前限制。有investigation ongoing 看看这些类型的限制是否可以解除。

    【讨论】:

      猜你喜欢
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 2015-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多