相关疑难解决方法(0)

为什么我可以返回对本地文字但不是变量的引用?

为什么这段代码会编译?

fn get_iter() -> impl Iterator<Item = i32> {
    [1, 2, 3].iter().map(|&i| i)
}

fn main() {
    let _it = get_iter();
}
Run Code Online (Sandbox Code Playgroud)

[1, 2, 3]是一个局部变量并iter()借用它.此代码不应编译,因为返回的值包含对局部变量的引用.

reference rust borrow-checker

18
推荐指数
1
解决办法
1094
查看次数

为什么可以从函数返回对文字的可变引用?

当前版本的The Rustonomicon有这个示例代码:

use std::mem;

pub struct IterMut<'a, T: 'a>(&'a mut [T]);

impl<'a, T> Iterator for IterMut<'a, T> {
    type Item = &'a mut T;

    fn next(&mut self) -> Option<Self::Item> {
        let slice = mem::replace(&mut self.0, &mut []);
        if slice.is_empty() {
            return None;
        }

        let (l, r) = slice.split_at_mut(1);
        self.0 = r;
        l.get_mut(0)
    }
}
Run Code Online (Sandbox Code Playgroud)

我特别对这条线感到困惑:

let slice = mem::replace(&mut self.0, &mut []);
//                                    ^^^^^^^ 
Run Code Online (Sandbox Code Playgroud)

这个借书怎么查?如果这是一个不可变的借用,RFC 1414指出[]右值应该有'static生命周期,这样一个不可变的借用会借用检查,但这个例子显示了一个可变的借用!似乎必须发生两件事之一:

  • 要么[]是临时的(以便它可以可变地使用),在这种情况下它没有'static生命周期,并且不应该借用检查;
  • 或者它 …

rust borrow-checker

7
推荐指数
1
解决办法
648
查看次数

标签 统计

borrow-checker ×2

rust ×2

reference ×1