50 lines
1.1 KiB
Rust
50 lines
1.1 KiB
Rust
// edition:2021
|
|
//check-pass
|
|
#![warn(unused)]
|
|
#![allow(dead_code)]
|
|
#![feature(rustc_attrs)]
|
|
|
|
#[derive(Debug, Clone, Copy)]
|
|
enum PointType {
|
|
TwoD { x: u32, y: u32 },
|
|
|
|
ThreeD{ x: u32, y: u32, z: u32 }
|
|
}
|
|
|
|
// Testing struct patterns
|
|
struct Points {
|
|
points: Vec<PointType>,
|
|
}
|
|
|
|
impl Points {
|
|
pub fn test1(&mut self) -> Vec<usize> {
|
|
(0..self.points.len())
|
|
.filter_map(|i| {
|
|
let idx = i as usize;
|
|
match self.test2(idx) {
|
|
PointType::TwoD { .. } => Some(i),
|
|
PointType::ThreeD { .. } => None,
|
|
}
|
|
})
|
|
.collect()
|
|
}
|
|
|
|
pub fn test2(&mut self, i: usize) -> PointType {
|
|
self.points[i]
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
let mut points = Points {
|
|
points: Vec::<PointType>::new()
|
|
};
|
|
|
|
points.points.push(PointType::ThreeD { x:0, y:0, z:0 });
|
|
points.points.push(PointType::TwoD{ x:0, y:0 });
|
|
points.points.push(PointType::ThreeD{ x:0, y:0, z:0 });
|
|
points.points.push(PointType::TwoD{ x:0, y:0 });
|
|
|
|
println!("{:?}", points.test1());
|
|
println!("{:?}", points.points);
|
|
}
|