首页 文章

为什么要使用i32的不可变引用

提问于
浏览
8

在Rust书的Lifetimes一章中,有一个例子:

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);
}

为什么他们使用 x: &'a i32

我想如果它只是 x: i32 那么他们就无法证明终身使用情况 . 但是,背后还有其他原因吗?是否有任何 生产环境 代码使用对i32等基本类型的不可变引用?

1 回答

  • 11

    在这种特殊情况下,原因确实是显示了生命的概念 . 但是,对于一般情况,我认为没有理由对基本类型进行不可变引用(当然,可变引用是另一回事),除非在通用代码中完成它:

    struct Holder<'a, T> {
        r: &'a T
    }
    
    let x: i32 = 123;
    let h: Holder<i32> = Holder { r: &x };
    

    如果你有这样的结构,你别无选择使用对 i32 的引用 . 当然,这种结构也可以与其他非原始和不可移动的类型一起使用 .

    正如Shepmaster在评论中提到的那样,确实有一种情况你可以引用基本类型 - 它是引用的迭代器 . 请记住,通过一个约定(标准库遵循),集合上的 iter() 方法应该将引用的迭代器返回到集合中:

    let v: Vec<i32> = vec![1, 2, 3, 4];
    let i = v.iter();  // i is Iterator<Item=&i32>
    

    然后几乎所有迭代器上接受闭包的方法都会接受其参数为引用的闭包:

    i.map(|n| *n + 1)  // n is of type &i32
    

    请注意,这实际上是泛型更一般情况的结果 . 向量和切片可以包含任意类型,包括不可移动的类型,因此它们只需要具有允许其用户借用其内容的方法 .

相关问题