在Rust中,struct StructName(DemoName);
这种用法定义的事一个元组结构体(tuple struct
),
它是一种特殊的结构体,
它的字段没有名称,只有索引。
它并不会直接继承DemoName
中所有pub
内容,而是将DemoName
作为一个单独的字段封装在结构体中。
为什么要这样做呢?这样做的好处是可以在不改变DemoName
的情况下,为其添加额外的功能。
元组结构体的定义和使用
struct DemoName {
pub index: i32,
pub value: String,
}
struct StructName(DemoName);
在上面的例子中,StructName
是一个元组结构体,它包含一个DemoName
类型的字段。
这个字段可以通过索引0
来访问。
fn main() {
let demo = DemoName {
index: 1,
value: "Hello".to_string(),
};
let struct_name = StructName(demo);
// 访问内部的`DemoName`结构体
println!("Index: {}", struct_name.0.index);
println!("Value: {}", struct_name.0.value);
}
在这个例子中,我们创建了一个DemoName
实例,
并将其作为一个字段封装在StructName
结构体中。
要访问DemoName
中的字段,我们使用struct_name.0
来访问。
自动解引用和Deref
通过实现Deref
trait,可以使元组结构体在使用时表现的像它所包含的值一样,从而简化代码。
use std::ops::Deref;
struct DemoName {
pub index: i32,
pub value: String,
}
struct StructName(DemoName);
impl Deref for StructName {
type Target = DemoName;
fn deref(&self) -> &Self::Target {
&self.0
}
}
fn main() {
let demo = DemoName {
index: 1,
value: "Hello".to_string(),
};
let struct_name = StructName(demo);
// 访问内部的`DemoName`结构体
println!("Index: {}", struct_name.index);
println!("Value: {}", struct_name.value);
}
在这个例子中,通过实现Deref
trait,我们可以直接访问StructName
中的DemoName
字段,
而不需要显式地使用索引0
。
结构体的创建和使用方式
普通结构体
普通结构体的字段有名字,可以通过名字来访问。
struct DemoName {
pub index: i32,
pub value: String,
}
fn main() {
let demo = DemoName {
index: 1,
value: "Hello".to_string(),
};
// 访问结构体的字段
println!("Index: {}", demo.index);
println!("Value: {}", demo.value);
}
元素结构体
元组结构体的字段没有名字,只有索引,可以通过索引来访问。
struct DemoName (i32, String);
fn main() {
let demo = DemoName(1, "Hello".to_string());
// 访问元组结构体的字段
println!("Index: {}", demo.0);
println!("Value: {}", demo.1);
}
单元结构体
单元结构体没有字段,通常用于标记或实现某些trait。
struct UnitStruct;
fn main() {
let unit = UnitStruct;
}