🦀 Rust 结构体快问快答

测试你对 Rust 结构体定义、实例化和方法的理解

10
题目数量
20
预计时间(分钟)
⭐⭐⭐
难度等级
第1题 (判断题)
在Rust中,结构体的字段默认是私有的,只能在定义结构体的模块内访问。
正确
错误

答案解析:

答案:正确

Rust中结构体的字段默认是私有的,需要使用pub关键字来使字段公开。

这是Rust封装性的体现,确保数据的安全性和一致性。

第2题 (选择题)
下列哪种不是Rust中的结构体类型?
命名字段结构体 (Named Field Struct)
元组结构体 (Tuple Struct)
单元结构体 (Unit Struct)
枚举结构体 (Enum Struct)

答案解析:

答案:枚举结构体 (Enum Struct)

Rust中有三种结构体类型:命名字段结构体、元组结构体和单元结构体。

枚举(enum)是一个独立的类型,不是结构体的一种。

第3题 (选择题)
以下哪个是正确的结构体定义?
A: struct Person { name: String, age: u32 } B: struct Person { name: String; age: u32; } C: struct Person ( name: String, age: u32 ) D: struct Person [ name: String, age: u32 ]
A
B
C
D

答案解析:

答案:A

命名字段结构体使用花括号{},字段之间用逗号分隔。

B使用了分号,这是错误的语法。

C和D使用了错误的括号类型。

第4题 (判断题)
元组结构体可以通过字段名来访问其字段。
正确
错误

答案解析:

答案:错误

元组结构体没有字段名,只能通过索引(如.0, .1)来访问字段。

例如:struct Color(i32, i32, i32); 访问时使用color.0, color.1, color.2。

第5题 (选择题)
下面哪个代码正确创建了结构体实例?
struct Point { x: i32, y: i32 } A: let p = Point { x: 10, y: 20 }; B: let p = Point ( 10, 20 ); C: let p = Point [ x: 10, y: 20 ]; D: let p = new Point { x: 10, y: 20 };
A
B
C
D

答案解析:

答案:A

命名字段结构体实例化使用花括号{},指定字段名和值。

Rust不使用new关键字,也不使用圆括号或方括号来实例化命名字段结构体。

第6题 (简答题)
在Rust中,为结构体实现方法需要使用哪个关键字?

答案解析:

答案:impl

使用impl关键字为结构体实现方法。

例如:impl Point { fn new(x: i32, y: i32) -> Point { ... } }

第7题 (选择题)
结构体方法的第一个参数通常是什么?
self
&self
&mut self
以上都可能

答案解析:

答案:以上都可能

self:获取所有权,方法调用后实例不可再使用。

&self:不可变借用,可以读取但不能修改。

&mut self:可变借用,可以修改实例。

选择哪种取决于方法的具体需求。

第8题 (判断题)
关联函数(Associated Functions)必须通过结构体实例来调用。
正确
错误

答案解析:

答案:错误

关联函数不需要实例,通过结构体名称和::语法调用。

例如:String::new()、Vec::new()等都是关联函数。

关联函数通常用作构造函数或工厂方法。

第9题 (选择题)
下面哪个是正确的结构体更新语法?
let user1 = User { name: "Alice".to_string(), age: 30 }; A: let user2 = User { name: "Bob".to_string(), ..user1 }; B: let user2 = User { name: "Bob".to_string(), ...user1 }; C: let user2 = User { name: "Bob".to_string(), &user1 }; D: let user2 = User { name: "Bob".to_string(), *user1 };
A
B
C
D

答案解析:

答案:A

结构体更新语法使用..语法,从另一个实例复制未指定的字段。

..user1必须放在最后,表示其余字段从user1复制。

这会移动或复制user1的字段,取决于字段类型是否实现Copy trait。

第10题 (简答题)
如果要让结构体能够被打印输出,需要为其派生哪个trait?

答案解析:

答案:Debug

使用#[derive(Debug)]可以自动实现Debug trait。

然后可以使用println!("{:?}", struct_instance)来打印结构体。

也可以使用{:#?}进行美化打印。

🎉
恭喜完成测验!
10/10
你对Rust结构体的掌握非常出色!