Rust 结构体

fn main(){
    ///  实例化结构体
    let  width = 1024;
    let height = 576;
    let image = GrayscaleMap{
        pixels: vec![0;width * height],
        size:(width, height)
    };
    println!("{:?}",image.size);
    let  hokey = Boom{
        name: "Hokey".to_string(),
        height:60,
        health:100,
        position:(100.0, 200.0, 0.0),
        intent: BroomIntent::FetchWater
    };

    let (hokey1,hokey2) = hokey.chop();
    println!("{:#?}\n{:#?}",hokey1,hokey2);
    

}
#[derive(Debug)]
struct Boom{
    name: String,
    height:u32,
    health:u32,
    position: (f32, f32, f32),
    intent: BroomIntent
}
#[derive(Debug,Copy,Clone)]
enum BroomIntent{ FetchWater,  DumpWater }

impl Boom{
    /// # 构造函数
    fn new(name:String,height:u32,health:u32,position:(f32,f32,f32),intent:BroomIntent) -> Boom{
        Boom{name,height,health,position,intent}
    }
    ///  # 一分为二
    /// 
    fn chop(self) ->(Boom,Boom){
        //高度为原始的一半,其余的不变
        // 使用 .. 来继承另一个相同类型的结构体实例的其余字段
        let mut broom1 = Boom{height: self.height/2, ..self};
        // 因为字段 name  是不可复制的String 类型,所以需要显示的 clone
        let mut broom2 = Boom{name: broom1.name.clone(), ..broom1};
        // 给每一个Boom起个不一样的名字
        broom1.name.push_str("_1");
        broom2.name.push_str("_2");
        (broom1, broom2)
    }
    
}

///  #  命名字段结构体
/// 结构体默认是私有的,
/// 要想让这个结构体对外部可见,需要在它的定义之前加上pub,前且其字段也要相应的增加pub 
#[derive(Debug,Clone)]
struct GrayscaleMap{
    pixels: Vec<u8>,
    size: (usize,usize)
}

impl GrayscaleMap{
    /// * 当局部变量或者参与与字段同名时,可以采用如下的简写方式
    /// 
    fn new_map(size:(usize, usize),pixels: Vec<u8>) -> GrayscaleMap{
        assert_eq!(pixels.len(),size.0 *size.1);
        GrayscaleMap{pixels,size}
    }
}
上一篇:Java生产环境调优—模拟一次内存溢出


下一篇:《定时执行专家 5.4》版 - 更新内容及下载连接