Reference 为什么要使用对i32的不可变引用
在铁锈书的生命周期一章中,有一个例子:Reference 为什么要使用对i32的不可变引用,reference,rust,primitive-types,Reference,Rust,Primitive Types,在铁锈书的生命周期一章中,有一个例子: struct Foo<'a> { x: &'a i32, } fn main() { let y = &5; // this is the same as `let _y = 5; let y = &_y;` let f = Foo { x: y }; println!("{}", f.x); } struct Foo在这种特殊情况下,原因确实是为了展示生命周期的概念。但是,对于一般
struct Foo<'a> {
x: &'a i32,
}
fn main() {
let y = &5; // this is the same as `let _y = 5; let y = &_y;`
let f = Foo { x: y };
println!("{}", f.x);
}
struct Foo在这种特殊情况下,原因确实是为了展示生命周期的概念。但是,对于一般情况,我认为没有理由对基元类型进行不可变引用(当然,可变引用是另一回事),除非是在泛型代码中进行:
struct Holder<'a, T> {
r: &'a T
}
let x: i32 = 123;
let h: Holder<i32> = Holder { r: &x };
然后,迭代器上几乎所有接受闭包的方法都将接受参数为引用的闭包:
i.map(|n| *n + 1) // n is of type &i32
请注意,这实际上是泛型更一般情况的结果。向量和切片可能包含任意类型,包括不可移动的类型,因此它们必须有允许用户借用其内容的方法。使用不可变引用作为观察者如何?@zenith什么的观察者?当有未偿还的借款时,你不能改变价值。@Shepmaster Oh完全忘记了这一点。谢谢@Shepmaster,你能举个例子吗&[i32]?非常感谢。我已经更新了答案,以便在切片上展开更多内容。然而,我仍然认为这只是泛型情况的一个结果——切片提供迭代器生成引用的原因是因为它们是泛型的,可以保存任意类型,所以它们需要一种允许用户借用其内容的方法。
i.map(|n| *n + 1) // n is of type &i32