重构主函数,添加泛型和特征实现,增加 Point 结构体及其方法,添加 Post 和 Weibo 结构体及其摘要功能,新增输出文件
This commit is contained in:
parent
5490f28e43
commit
3c4e77cb9d
186
main.rs
186
main.rs
@ -1,58 +1,162 @@
|
|||||||
struct Car {
|
use std::fmt::Display;
|
||||||
color: String,
|
|
||||||
transmission: Transmission,
|
fn add<T: std::ops::Add<Output = T>>(a: T, b: T) -> T {
|
||||||
convertible: bool,
|
a + b
|
||||||
age: (Age, u32),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq, Debug)]
|
fn largest<T: PartialOrd + Copy>(list: &[T]) -> T {
|
||||||
enum Age {
|
let mut largest = list[0];
|
||||||
New,
|
|
||||||
Used,
|
for &item in list.iter() {
|
||||||
|
if item > largest {
|
||||||
|
largest = item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
largest
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(PartialEq, Debug)]
|
fn create_and_print<T>()
|
||||||
enum Transmission {
|
where
|
||||||
Manual,
|
T: From<i32> + Display,
|
||||||
SemiAuto,
|
{
|
||||||
Automatic,
|
let a: T = 100.into();
|
||||||
|
println!("{}", a);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn car_factory(color: String, transmission: Transmission, convertible: bool, miles: u32) -> Car {
|
struct Point<T, U> {
|
||||||
Car {
|
x: T,
|
||||||
color,
|
y: U,
|
||||||
transmission,
|
}
|
||||||
convertible,
|
|
||||||
age: car_quality(miles),
|
impl<T, U> Point<T, U> {
|
||||||
|
fn mixup<V, W>(self, other: Point<V, W>) -> Point<T, W> {
|
||||||
|
Point {
|
||||||
|
x: self.x,
|
||||||
|
y: other.y,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn car_quality(miles: u32) -> (Age, u32) {
|
impl Point<i32, f64> {
|
||||||
if miles > 100 {
|
fn distance_from_origin(&self) -> f64 {
|
||||||
return (Age::Used, miles);
|
((self.x.pow(2) + (self.y as i32).pow(2)) as f64).sqrt()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
(Age::New, miles)
|
// fn display_array(arr: &[i32]) {
|
||||||
|
// println!("{:?}", arr);
|
||||||
|
// }
|
||||||
|
// fn display_array<T: std::fmt::Debug>(arr: &[T]) {
|
||||||
|
// println!("{:?}", arr);
|
||||||
|
// }
|
||||||
|
fn display_array<T: std::fmt::Debug, const N: usize>(arr: &[T; N]) {
|
||||||
|
println!("{:?}", arr);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Buffer<const N: usize> {
|
||||||
|
data: [u8; N],
|
||||||
|
}
|
||||||
|
|
||||||
|
const fn compute_buffer_size(factor: usize) -> usize {
|
||||||
|
1024 * factor
|
||||||
|
}
|
||||||
|
|
||||||
|
pub trait Summary {
|
||||||
|
fn summarize(&self) -> String;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Post {
|
||||||
|
pub title: String,
|
||||||
|
pub author: String,
|
||||||
|
pub content: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Summary for Post {
|
||||||
|
fn summarize(&self) -> String {
|
||||||
|
format!("{} by {}", self.title, self.author)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Weibo {
|
||||||
|
pub username: String,
|
||||||
|
pub content: String,
|
||||||
|
pub created_at: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Summary for Weibo {
|
||||||
|
fn summarize(&self) -> String {
|
||||||
|
format!("{}: {}", self.username, self.content)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn notify(item: &impl Summary) {
|
||||||
|
println!("Breaking news! {}", item.summarize());
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn notify_plus<T: Summary>(item: &T, item2: &T) {
|
||||||
|
println!("Breaking news! {}", item.summarize());
|
||||||
|
println!("Breaking news! {}", item2.summarize());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
println!("Hello, world");
|
// let a = 1;
|
||||||
let colors = ["Blue", "Green", "Red", "Silver"];
|
// let b = 1;
|
||||||
let mut car = car_factory(String::from(colors[0]), Transmission::Automatic, false, 0);
|
let a = 1.2;
|
||||||
println!(
|
let b = 1.4;
|
||||||
"Car order 1: {:?}, Hard top = {}, {:?}, {}, {} miles",
|
println!("{}", add(a, b));
|
||||||
car.age.0, car.color, car.convertible, car.color, car.age.1
|
create_and_print::<i64>();
|
||||||
);
|
|
||||||
|
|
||||||
car = car_factory(String::from(colors[1]), Transmission::SemiAuto, false, 1);
|
let p1 = Point { x: 5, y: 10.4 };
|
||||||
println!(
|
let p2 = Point { x: "Hello", y: 'c' };
|
||||||
"Car order 1: {:?}, Hard top = {}, {:?},{:?}, {}, {} miles",
|
|
||||||
car.age.0, car.color, car.convertible, car.transmission, car.color, car.age.1
|
|
||||||
);
|
|
||||||
|
|
||||||
car = car_factory(String::from(colors[2]), Transmission::Manual, false, 101);
|
let p3 = p1.mixup(p2);
|
||||||
println!(
|
println!("p3.x = {}, p3.y = {}", p3.x, p3.y);
|
||||||
"Car order 1: {:?}, Hard top = {}, {:?}, {}, {} miles",
|
|
||||||
car.age.0, car.color, car.convertible, car.color, car.age.1
|
let p4 = Point { x: 5, y: 10.4 };
|
||||||
);
|
println!("{}", p4.distance_from_origin());
|
||||||
|
|
||||||
|
let arr = [1, 2, 3, 4, 5];
|
||||||
|
display_array(&arr);
|
||||||
|
|
||||||
|
let arr: [i32; 3] = [1, 2, 3];
|
||||||
|
display_array(&arr);
|
||||||
|
|
||||||
|
const SIZE: usize = compute_buffer_size(10);
|
||||||
|
let buffer = Buffer { data: [0; SIZE] };
|
||||||
|
println!("{:?}", buffer.data.len());
|
||||||
|
|
||||||
|
let post = Post {
|
||||||
|
title: String::from("Post Title"),
|
||||||
|
author: String::from("Post Author"),
|
||||||
|
content: String::from("Post Content"),
|
||||||
|
};
|
||||||
|
println!("{}", post.summarize());
|
||||||
|
|
||||||
|
let weibo = Weibo {
|
||||||
|
username: String::from("Weibo User"),
|
||||||
|
content: String::from("Weibo Content"),
|
||||||
|
created_at: String::from("2021-01-01"),
|
||||||
|
};
|
||||||
|
println!("{}", weibo.summarize());
|
||||||
|
notify(&post);
|
||||||
|
notify(&weibo);
|
||||||
|
|
||||||
|
let post2 = Post {
|
||||||
|
title: String::from("Post Title 2"),
|
||||||
|
author: String::from("Post Author 2"),
|
||||||
|
content: String::from("Post Content 2"),
|
||||||
|
};
|
||||||
|
// notify_plus(&post, &weibo);
|
||||||
|
notify_plus(&post, &post2);
|
||||||
|
|
||||||
|
let number_list = vec![34, 50, 25, 100, 65];
|
||||||
|
|
||||||
|
let result = largest(&number_list);
|
||||||
|
println!("The largest number is {}", result);
|
||||||
|
|
||||||
|
let char_list = vec!['y', 'm', 'a', 'q'];
|
||||||
|
|
||||||
|
let result = largest(&char_list);
|
||||||
|
println!("The largest char is {}", result);
|
||||||
}
|
}
|
||||||
|
|||||||
5
minigrep/output.txt
Normal file
5
minigrep/output.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
Searching for to
|
||||||
|
In file poem.txt
|
||||||
|
Case sensitive
|
||||||
|
Are you nobody, too?
|
||||||
|
How dreary to be somebody!
|
||||||
Reference in New Issue
Block a user