MST

星途 面试题库

面试题:Rust中所有权转移在函数调用与返回时是如何体现的

假设有一个自定义结构体`MyStruct`,包含一些数据成员。写一个函数`process`,接收`MyStruct`实例作为参数并返回处理后的结果。解释在调用`process`函数过程中,所有权是如何转移的,函数返回值的所有权又如何处理。如果`process`函数中想要借用传入的`MyStruct`实例而不转移所有权,应该如何实现?
12.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

以下以Rust语言为例进行解答:

1. 定义结构体及函数实现(转移所有权)

struct MyStruct {
    data: i32
}

fn process(mut s: MyStruct) -> i32 {
    s.data += 1;
    s.data
}

在调用process函数过程中,所有权从调用者转移到函数process内部。函数process获得MyStruct实例的所有权后,可以对其进行修改。函数返回值是i32类型,它的所有权被返回给调用者。

2. 借用传入的MyStruct实例而不转移所有权

struct MyStruct {
    data: i32
}

fn process(s: &MyStruct) -> i32 {
    s.data + 1
}

这里函数process参数使用&MyStruct,这是对MyStruct实例的借用。这样调用者仍然保留MyStruct实例的所有权,函数process只能读取借用的数据,不能修改(如需修改,可以使用&mut MyStruct)。函数返回值i32的所有权被返回给调用者,而原MyStruct实例的所有权在调用者手中不受影响。