当前位置: 首页 > 知识库问答 >
问题:

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

洪哲彦
2023-03-14

在《生锈的一生》一章中,有一个例子:

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:

我认为,如果只是x:i32,那么他们就无法演示终身使用。然而,这背后还有其他原因吗?是否有任何生产代码使用对i32之类的基元类型的不可变引用?


共有1个答案

山高峰
2023-03-14

在这种特殊情况下,原因确实是为了展示生命周期的概念。然而,对于一般情况,我认为没有理由对基元类型进行不可变引用(当然,可变引用是另一回事),除非在泛型代码中进行:

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

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

 类似资料:
  • 我读了很多关于应该使用的案例。 我读过的许多页面都说不应该用于私有实例变量,而应该由getters返回。 我认为将私有实例变量作为可选变量仍然是有用的。如果有人查看我的代码,他们可以看到一个值可以是空的,而不必检查留档是否可以返回空。 在Scala中,null从未使用过,它只是用于与Java的互操作性。如果值可以为null,建议始终使用可选值。这种方法对我来说更有意义。 这里有一页提到了它: ht

  • 问题内容: 为什么Java要求char变量用单引号而不是双引号将其中的任何内容括起来?一个例子: vs: 我知道双引号主要用于字符串,但是是否有特定原因说明为什么将chars构造为仅使用单引号并在输入双引号时中断? 我已经尝试进行一些研究,但是唯一相关的是另一个SO Question,它是指单引号和双引号之间的差异,而不是char的句法开发背后的原因。 问题答案: 因为和是两种不同的类型,Java

  • eval 函数会在当前作用域中执行一段 JavaScript 代码字符串。 var foo = 1; function test() { var foo = 2; eval('foo = 3'); return foo; } test(); // 3 foo; // 1 但是 eval 只在被直接调用并且调用函数就是 eval 本身时,才在当前作用域中执行。 var fo

  • 很多人都说不应该完全否定 Window,Windows 也有它的长处。不应该骂微软。 对。Windows 容易操作,适合普通用户。如果微软把它自己定位在 P&G,Philips 那样的地位,能够给我们的百姓提供周到的,完善的,价廉物美的服务。那我肯定是很喜欢它的。 但是从上面的种种情况说明,微软是一个野心极大的国际垄断组织!它的产品没有一个是不出问题的:Windows 不稳定,容易中病毒,而微软不

  • 问题内容: 就像标题所问的那样,Django伙计们为什么决定使用querydict来实现request.POST对象(当然,这又使整个事情变得不可变了?) 我知道你可以通过复制帖子数据来对其进行更改 但是为什么呢?当然,仅允许事物变得易变会更简单吗?还是由于其他原因使用它而可能导致问题? 问题答案: 这是一个谜,不是吗?在调查中,一些表面上似乎合理的理论是错误的: 这样POST对象就不必实现变异方

  • 问题内容: 为什么Redux中的对象是不可变的?我知道某些框架(例如Angular2)将使用onPush并可以利用不变性来比较视图状态以更快地呈现,但是我想知道是否还有其他原因,因为Redux与框架无关,但它在其自己的文档中提到要使用不变性(与框架无关)。 感谢任何反馈。 问题答案: Redux是一个小型库,将状态表示为(不可变的)对象。和 新状态 通过将当前状态传递给纯函数来创建全新的对象/应用