面试题答案
一键面试基本类型
- 使用场景:
- 初始化变量:例如
let num: i32 = 5;
,这里使用=
将值5
赋给num
变量,声明并初始化了一个i32
类型的整数。 - 重新赋值:
let mut num: i32 = 5; num = 10;
,mut
关键字使变量可变,后续可以使用=
对其重新赋值。
- 初始化变量:例如
- 注意事项:
- 类型必须匹配:
let num: i32 = "hello";
这样的赋值会报错,因为"hello"
是字符串字面量,类型与i32
不匹配。
- 类型必须匹配:
自定义结构体
- 使用场景:
- 初始化结构体实例:
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
被更新为 30
,y
继承自 p1
的值。
2. 注意事项:
- 结构体字段名必须匹配:如果结构体定义了
x
和y
字段,初始化时必须提供这两个字段名对应的赋值。例如let p1 = Point { a: 10, b: 20 };
会报错,因为Point
结构体中没有a
和b
字段。 - 所有权和借用:如果结构体中包含具有所有权语义的类型(如
String
),赋值可能会涉及所有权转移。例如:
struct MyStruct {
s: String,
}
let s1 = String::from("hello");
let m1 = MyStruct { s: s1 };
let m2 = m1;
// 这里 m1 不再有效,因为所有权转移给了 m2
// 尝试使用 m1 会报错
如果需要共享数据,可以使用 &str
代替 String
或者使用 Rc
、Arc
等智能指针。