结构体
有了结构体,你可以创建自己的类型。在 Rust 中,你会一直使用结构体,因为它们非常方便。结构体是用关键字 struct
创建的。结构体的名称应该用UpperCamelCase(每个字用大写字母,不要用空格)。如果你用全小写的结构,编译器会告诉你。
有三种类型的结构。一种是 "单元结构"。单元的意思是 "没有任何东西"。对于一个单元结构,你只需要写名字和一个分号。
struct FileDirectory;
fn main() {}
接下来是一个元组结构,或者说是一个未命名结构。之所以是 "未命名",是因为你只需要写类型,而不是字段名。当你需要一个简单的结构,并且不需要记住名字时,元组结构是很好的选择。
struct Colour(u8, u8, u8);
fn main() {
let my_colour = Colour(50, 0, 50); // Make a colour out of RGB (red, green, blue)
println!("The second part of the colour is: {}", my_colour.1);
}
这时打印出The second part of the colour is: 0
。
第三种类型是命名结构。这可能是最常见的结构。在这个结构中,你在一个 {}
代码块中声明字段名和类型。请注意,在命名结构后面不要写分号,因为后面有一整个代码块。
struct Colour(u8, u8, u8); // Declare the same Colour tuple struct
struct SizeAndColour {
size: u32,
colour: Colour, // And we put it in our new named struct
}
fn main() {
let my_colour = Colour(50, 0, 50);
let size_and_colour = SizeAndColour {
size: 150,
colour: my_colour
};
}
在一个命名结构中,你也可以用逗号来分隔字段。对于最后一个字段,你可以加一个逗号或不加--这取决于你。SizeAndColour
在 colour
后面有一个逗号。
struct Colour(u8, u8, u8); // Declare the same Colour tuple struct
struct SizeAndColour {
size: u32,
colour: Colour, // And we put it in our new named struct
}
fn main() {}
但你不需要它。但总是放一个逗号可能是个好主意,因为有时你会改变字段的顺序。
struct Colour(u8, u8, u8); // Declare the same Colour tuple struct
struct SizeAndColour {
size: u32,
colour: Colour // No comma here
}
fn main() {}
然后我们决定改变顺序...
struct SizeAndColour {
colour: Colour // ⚠️ Whoops! Now this doesn't have a comma.
size: u32,
}
fn main() {}
但无论哪种方式都不是很重要,所以你可以选择是否使用逗号。
我们创建一个Country
结构来举例说明。Country
结构有population
、capital
和leader_name
三个字段。
struct Country {
population: u32,
capital: String,
leader_name: String
}
fn main() {
let population = 500_000;
let capital = String::from("Elista");
let leader_name = String::from("Batu Khasikov");
let kalmykia = Country {
population: population,
capital: capital,
leader_name: leader_name,
};
}
你有没有注意到,我们把同样的东西写了两次?我们写了population: population
、capital: capital
和leader_name: leader_name
。实际上,你不需要这样做:如果字段名和变量名是一样的,你就不用写两次。
struct Country {
population: u32,
capital: String,
leader_name: String
}
fn main() {
let population = 500_000;
let capital = String::from("Elista");
let leader_name = String::from("Batu Khasikov");
let kalmykia = Country {
population,
capital,
leader_name,
};
}