1.struct结构体
1.struct结构体
注意定义时每一组成员(即使是最后一个)都要有一个逗号结尾
可以在struct关键字之后添加mut关键字令该结构体为可变类型,但此时所有成员都是可变的,rust不允许某一部分是可变的!

实例化时对成员的赋值顺序没有要求,因为类似于键值对赋值 可以通过打点访问结构体成员

简单情况下可以使用tuple struct:
相当于利用tuple的特性简化了struct,此时可以利用tuple的特性,比如打点索引访问,模式匹配解构
rust可以有多个impl块
rust可以有
关联函数类似于静态方法
struct示例代码:
#[derive(Debug)]
struct Rectangle
{
length:u64,
width:u64,
}
impl Rectangle
{
fn area(&self)->u64
{
self.length*self.width
}
fn can_hold(&self,other:&Rectangle)->bool
{
self.length>other.length&&self.width>other.width
}
}
impl Rectangle {
fn square(size:u64)->Rectangle
{
Rectangle { length: size, width: size,}
}
}
fn main()
{
let r=Rectangle{length:20,width:30,};
let r1=Rectangle{length:10,width:15,};
let r2=Rectangle{length:30,width:40,};
let s=Rectangle::square(10);
println!("{:#?}",r);
println!("the area of r is {}",r.area());
println!("could r hold r1 and r2? {},{}",r.can_hold(&r1),r.can_hold(&r2));
println!("the special rectangle s is:{:#?}",s);
}
2.枚举
示例代码:
//定义枚举类型
enum IPkind
{
IPv4,
IPv6,
}
//为枚举实现方法!
impl IPkind
{
fn call(&self)
{
println!("the enmu of IPkind is called!");
}
}
//定义附带相关数据的枚举--可以更加详细地描述枚举值
enum IPkindPlus
{
IPv4(u8,u8,u8,u8),
IPv6(String),
}
fn main()
{
//创建枚举值
let a=IPkind::IPv4;
let b=IPkind::IPv6;
b.call();
let c=IPkindPlus::IPv4(127, 0, 0, 1);
let d=IPkindPlus::IPv6(String::from("abcd"));
}
rust是没有null值的,但是null这种意思还是有意义的,为了在合适的时机能表达出这种意思,rust标准库内置了Option枚举:
代码示例:
//Some会自动推导出类型,表示该类型无名的一个值
let x=Some(8);
let y=Some("hello");
//None需要显式指名类型,表示该类型的一个空值
let z:Option<i32>=None;
let a=5;
let b=Some(8);
//错误用法:println!("a plus b ={a+b}");