pub fn understand_lifetime_early_late_bound()
Expand description
说明: 生命周期参数:late bound vs early bound
Quiz 11: https://dtolnay.github.io/rust-quiz/11
fn f<'a>() {}
fn g<'a: 'a>() {}
fn main() {
let pf = f::<'static> as fn(); // late bound
let pg = g::<'static> as fn(); // early bound
print!("{}", pf == pg);
}
示例一:late bound lifetime
struct Buffer {
buf: Vec<u8>,
pos: usize,
}
impl Buffer {
fn new() -> Buffer {
Buffer {
buf: vec![1,2,3, 4, 5,6],
pos: 0,
}
}
fn read_bytes<'a>(&'a mut self) -> &'a [u8] {
self.pos += 3;
&self.buf[self.pos-3..self.pos]
}
}
fn print(b1 :&[u8], b2: &[u8]) {
println!("{:#?} {:#?}", b1, b2)
}
fn main() {
let mut buf = Buffer::new();
// let b1 = buf.read_bytes(); // don't work
let b1 = &(buf.read_bytes().to_owned());
let b2 = buf.read_bytes();
print(b1,b2)
}
示例二: early bound lifetime
fn main() {
let v = vec![1,2,3, 4, 5,6];
let mut buf = Buffer::new(&v);
let b1 = buf.read_bytes();
// let b1 = &buf.read_bytes().to_owned();
let b2 = buf.read_bytes();
print(b1,b2)
}
fn print(b1 :&[u8], b2: &[u8]) {
println!("{:#?} {:#?}", b1, b2)
}
struct Buffer<'a> {
buf: &'a [u8],
pos: usize,
}
impl<'b, 'a: 'b> Buffer<'a> {
fn new(b: &'a [u8]) -> Buffer {
Buffer {
buf: b,
pos: 0,
}
}
fn read_bytes(&'b mut self) -> &'a [u8] {
self.pos += 3;
&self.buf[self.pos-3..self.pos]
}
}