结构体和枚举类型相似。
在什么情况下使用结构体比使用枚举类型更好呢(反之亦然)?有没有人能给出一个清晰的例子,说明使用结构体优于使用枚举类型?
enum
来模拟类似错误代码的东西,你一次只能拥有一个:enum ErrorCode {
NoDataReceived,
CorruptedData,
BadResponse,
}
如果需要,枚举变量可以包含值。例如,我们可以像这样向 ErrorCode
添加一个 case:
enum ErrorCode {
NoDataReceived,
CorruptedData,
BadResponse,
BadHTTPCode(u16),
}
ErrorCode::BadHTTPCode
的实例始终包含一个 u16
。// Unit structs have no fields
struct UnitStruct;
// Tuple structs contain anonymous values.
struct TupleStruct(u16, &'static str);
ErrorCode
的每个情况都可以存储在类型为 ErrorCode
的值中,如下所示(这对于不相关的结构体是不可能的)。fn handle_error(error: ErrorCode) {
match error {
ErrorCode::NoDataReceived => println!("No data received."),
ErrorCode::CorruptedData => println!("Data corrupted."),
ErrorCode::BadResponse => println!("Bad response received from server."),
ErrorCode::BadHTTPCode(code) => println!("Bad HTTP code received: {}", code)
};
}
fn main() {
handle_error(ErrorCode::NoDataReceived); // prints "No data received."
handle_error(ErrorCode::BadHTTPCode(404)); // prints "Bad HTTP code received: 404"
}
您可以对枚举类型进行匹配
,以确定您收到的是哪个变体,并根据其执行不同的操作。
相比之下,我上面没有提到的第三种结构体类型是最常用的 - 当他们简单地说“结构体”时,所有人都在指的就是这种类型的结构体。
struct Response {
data: Option<Data>,
response: HTTPResponse,
error: String,
}
fn main() {
let response = Response {
data: Option::None,
response: HTTPResponse::BadRequest,
error: "Bad request".to_owned()
}
}
Response
,必须给出所有字段的值。response
的值是如何创建的(即 HTTPResponse::Something
),这意味着 HTTPResponse
是一个枚举类型。它可能看起来像这样:enum HTTPResponse {
Ok, // 200
BadRequest, // 400
NotFound, // 404
}
self
,并为每个变量创建有效地不同的实现。 - Søren MortensenEnum
是一种具有受限值集的类型。
enum Rainbow {
Red,
Orange,
Yellow,
Green,
Blue,
Indigo,
Violet
}
let color = Red;
match color {
Red => { handle Red case },
// all the rest would go here
}
如果需要,您可以在枚举中存储数据。
enum ParseData {
Whitespace,
Token(String),
Number(i32),
}
fn parse(input: String) -> Result<String, ParseData>;
结构体是表示事物的一种方式。
struct Window {
title: String,
position: Position,
visible: boolean,
}
Window
对象,代表屏幕上的一个窗口。
pub enum
会使所有细节(变体和它们的字段)公开,而pub struct
默认仍然保持字段私有。如果您需要在公共接口中公开enum
数据但希望隐藏细节,则需要将(私有的)enum
包装在pub struct
中。 - Stefan