张老师我是这样理解的:
```rust
fn read_bytes(&mut self) -> &'a [u8] {
self.pos += 3; // 后面不需要可变引用, 可变引用只持续到这里.
&self.buf[self.pos - 3..self.pos]
}
}
fn main() {
let v = vec![1, 2, 3, 4, 5, 6];
let mut buf = Buffer::new(&v);
let b1 = buf.read_bytes(); // buf的可变引用在函数内部就结束了
let b2 = buf.read_bytes(); // buf的可变引用在函数内部就结束了
print(b1, b2);
}
```
输出生命周期必须和输入生命周期相关联, 本例中 read_bytes 真正的和输出生命周期相关联的输
入生命周期是 Buffer::buf 的生命周期, 让 read_bytes 输出的生命周期和 Buffer::buf 的生
命周期保持一致, 就保证了输出生命周期小于等于输入生命周期.
上面的为什么可以执行两次 `buf.read_bytes`, 执行两次 `buf.read_bytes` 之后还可以打印 b1, b2
因为 `fn read_bytes(&mut self) -> &'a [u8]` 返回的生命周期和 `Buffer::buf` 也就是 `&v`
的生命周期一致, 都是 `'a`. 两次调用 `buf.read_bytes` 返回的 b1 和 b2 的生命周期都是 `&v`
的生命周期. 而实例 buf 的可变引用在 `read_bytes` 函数中的 `self.pos += 3;` 那一行就结束了.
实例 buf 的可变引用在 `read_bytes` 函数内部就结束了. 所以可以重复调用 `read_bytes`, 并且
调用之后还可以访问其返回值 `b1`, `b2`.
----------------------------------------
如果改成下面的
```rust
fn read_bytes(&mut self) -> &[u8] {
self.pos += 3;
&self.buf[self.pos - 3..self.pos]
}
}
fn main() {
let v = vec![1, 2, 3, 4, 5, 6];
let mut buf = Buffer::new(&v);
let b1 = buf.read_bytes();
let b2 = buf.read_bytes();
println!("{:#?}",b2); // 这个是可以的
// 下面的会编译报错, 因为使用 b1 会使 b1 那里的对应的buf的可变借用的生命周期延长,
// 延长之后的可变借用的生命周期会覆盖到 b2 的生命周期那一行. 会造成多次可变借用的情况.
// println!("{:#?} {:#?}", b1, b2);
}
```
因为改成 `fn read_bytes(&mut self) -> &[u8]` 之后, 实例 buf 的可变引用的生命周期和返回
值的生命周期一致, 由于 NLL 虽然也可以连续调用 `read_bytes` 多次, 但是无法使用第一次调用返
回的值, 只能使用最后一次返回的值, 因为如果使用第一次返回的值, 会让第一次 buf 的可变借用生命
周期延长到使用的那个地方, 就会造次多次可变借用的情况.