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