MST

星途 面试题库

面试题:Rust中赋值运算符的常见使用场景及注意事项

请详细阐述Rust中赋值运算符(如`=`)在不同数据类型(如基本类型、自定义结构体等)上的常见使用场景,并指出可能出现的陷阱或需要注意的地方。
30.9万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

基本类型

  1. 使用场景
    • 初始化变量:例如 let num: i32 = 5;,这里使用 = 将值 5 赋给 num 变量,声明并初始化了一个 i32 类型的整数。
    • 重新赋值:let mut num: i32 = 5; num = 10;mut 关键字使变量可变,后续可以使用 = 对其重新赋值。
  2. 注意事项
    • 类型必须匹配:let num: i32 = "hello"; 这样的赋值会报错,因为 "hello" 是字符串字面量,类型与 i32 不匹配。

自定义结构体

  1. 使用场景
    • 初始化结构体实例:
struct Point {
    x: i32,
    y: i32,
}
let p1 = Point { x: 10, y: 20 };

这里使用 = 创建并初始化了一个 Point 结构体实例 p1

  • 结构体更新语法(针对可变结构体):
let mut p1 = Point { x: 10, y: 20 };
let p2 = Point { x: 30, ..p1 };

这里 p2 是基于 p1 创建的新结构体实例,x 被更新为 30y 继承自 p1 的值。 2. 注意事项

  • 结构体字段名必须匹配:如果结构体定义了 xy 字段,初始化时必须提供这两个字段名对应的赋值。例如 let p1 = Point { a: 10, b: 20 }; 会报错,因为 Point 结构体中没有 ab 字段。
  • 所有权和借用:如果结构体中包含具有所有权语义的类型(如 String),赋值可能会涉及所有权转移。例如:
struct MyStruct {
    s: String,
}
let s1 = String::from("hello");
let m1 = MyStruct { s: s1 };
let m2 = m1;
// 这里 m1 不再有效,因为所有权转移给了 m2
// 尝试使用 m1 会报错

如果需要共享数据,可以使用 &str 代替 String 或者使用 RcArc 等智能指针。