diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..ebf5faa --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,562 @@ +use core::fmt; +use std::cell::RefCell; +use std::collections::HashMap; +use std::fmt::{Display, Formatter}; +use std::fs::File; +use std::io::{self, Read}; +use std::ops::Deref; +use std::rc::{Rc, Weak}; + +#[derive(Debug)] +pub struct Point1 { + pub x: T, + pub y: U, +} + +impl Point1 { + pub fn x(&self) -> &D { + &self.x + } +} + +impl Point1 { + pub fn y(&self) -> i32 { + self.y + } +} + +impl Point1 { + pub fn mixup(self, p: Point1) -> Point1 { + Point1 { x: self.x, y: p.y } + } +} + +pub fn test_tuple(t: (i32, &str)) { + println!("{} {}", t.0, t.1); +} + +pub static mut COUNTER: u32 = 0; + +pub fn add_to_count(inc: u32) { + unsafe { + COUNTER += inc; + } +} + +#[derive(Debug)] +pub struct Bt { + pub height: u32, + pub label: Option, +} + +#[derive(Debug)] +pub struct SelectBox { + pub width: u32, + pub height: u32, + pub options: Vec, +} + +impl Draw for SelectBox { + fn draw(&self) { + // code to actually draw a select box + println!("{:?}", self); + } +} + +#[derive(Debug)] +pub struct Button { + pub width: u32, + pub height: u32, + pub label: String, +} + +impl Draw for Button { + fn draw(&self) { + // 实际绘制按钮的代码 + println!("{:?}", self); + } +} + +pub struct Screen { + pub components: Vec>, +} + +impl Screen { + pub fn run(&self) { + for component in self.components.iter() { + component.draw(); + } + } +} + +pub trait Draw { + fn draw(&self); +} + +pub struct MyBox(T); + +impl MyBox { + pub fn new(x: T) -> MyBox { + MyBox(x) + } +} + +impl Deref for MyBox { + type Target = T; + + fn deref(&self) -> &T { + &self.0 + } +} + +pub fn hello_str(name: &str) { + println!("Hello, {}!", name); +} + +#[derive(Debug)] +pub enum List { + Cons(i32, RefCell>), + Nil, +} + +impl List { + pub fn tail(&self) -> Option<&RefCell>> { + use crate::List::*; + match self { + Cons(_, item) => Some(item), + Nil => None, + } + } +} + +#[derive(Debug)] +pub struct Node { + pub value: i32, + pub parent: RefCell>, + pub children: RefCell>>, +} + +pub fn change(some_string: &mut String) { + some_string.push_str(", world"); +} + +//enum IpAddrKind { +// V4, +// V6, +//} + +#[derive(Debug)] +pub enum IpAddr { + V4(u8, u8, u8, u8), + V6(String), +} + +pub enum Color { + _Rgb(i32, i32, i32), + Hsv(i32, i32, i32), +} + +pub enum Msg { + _Quit, + ChangeColor(Color), +} + +// Quit 没有关联任何数据。 +// Move 包含一个匿名结构体。 +// Write 包含单独一个 String。 +// ChangeColor 包含三个 i32。 +#[derive(Debug)] +pub enum Message { + Quit, + Move { x: i32, y: i32 }, + Write(String), + ChangeColor(i32, i32, i32), +} + +impl Message { + pub fn call(&self) { + println!("this message call."); + } +} + +#[derive(Debug)] +pub struct Rectangle { + pub width: u32, + pub height: u32, +} + +impl Rectangle { + pub fn area(&self) -> u32 { + self.width * self.height + } + + pub fn can_hold(&self, other: &Rectangle) -> bool { + self.width > other.width && self.height > other.height + } + + pub fn square(size: u32) -> Rectangle { + Rectangle { + width: size, + height: size, + } + } +} + +mod sound { + pub mod instrument { + pub fn clarinet() { + println!("this clarinet"); + } + } +} + +pub mod performance_group { + pub use crate::sound::instrument; + + pub fn clarinet_trio() { + instrument::clarinet(); + instrument::clarinet(); + instrument::clarinet(); + } +} + +/// 传播错误 +pub fn read_username_from_file(path: &str) -> Result { + // 1. + // let f = File::open(path); + // + // let mut f = match f { + // Ok(file) => file, + // Err(error) => return Err(error), + // }; + // + // let mut s = String::new(); + // match f.read_to_string(&mut s) { + // Ok(_) => Ok(s), + // Err(e) => Err(e), + // } + + // 2. + let mut f = File::open(path)?; + + let mut s = String::new(); + f.read_to_string(&mut s)?; + Ok(s) + + // 3. + // let mut s = String::new(); + // File::open(path)?.read_to_string(&mut s)?; + // Ok(s) + + // 4. + // fs::read_to_string(path) +} + +pub trait Summary { + fn summarize_author(&self) -> String; + + fn summarize(&self) -> String { + format!("(Read more from {}...)", self.summarize_author()) + } +} + +#[derive(Debug)] +pub struct Tweet { + pub username: String, + pub content: String, + pub reply: bool, + pub retweet: bool, +} + +impl Summary for Tweet { + fn summarize_author(&self) -> String { + format!("@{}", self.username) + } +} + +// impl ToString for Tweet { +// fn to_string(&self) -> String { +// format!("{:?}", self) +// } +// } + +impl Display for Tweet { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + write!( + f, + "Tweet username: {}, content: {}", + self.username, self.content + ) + } +} + +//fn notify(t: &T, u: &U) -> String { +// format!("{}, {}", u.summarize(), t.to_string()) +//} + +//fn notify(t: &(impl Summary + ToString), u: &(impl Summary)) -> String { +// format!("{}, {}", u.summarize(), t.to_string()) +//} + +pub fn notify(t: &T, u: &U) -> String +where + T: Summary + ToString, + U: Summary, +{ + format!("{}, {}", u.summarize(), t.to_string()) +} + +// 返回实现了指定 trait 的方法 +pub fn returns_summarizable() -> impl Summary { + Tweet { + username: String::from("horse_ebooks"), + content: String::from("of course, as you probably already know, people"), + reply: false, + retweet: false, + } +} + +pub fn largest(list: &[T]) -> T { + //fn largest(list: &[impl PartialOrd + Copy]) -> impl PartialOrd + Copy { + //fn largest(list: &[T]) -> T + // where T: PartialOrd + Copy { + let mut largest = list[0]; + + for &item in list.iter() { + if item > largest { + largest = item; + } + } + + // for item in list.iter() { + // if *item > largest { + // largest = *item; + // } + // } + + return largest; +} + +pub fn largest2(list: &[T]) -> &T { + let mut largest = &list[0]; + + for item in list.iter() { + if item > largest { + largest = item; + } + } + + return largest; +} + +#[derive(Debug)] +pub struct Pair { + x: T, + y: T, +} + +impl Pair { + pub fn new(x: T, y: T) -> Self { + Self { x, y } + } +} + +// 只有那些为 T 类型实现了 PartialOrd trait(来允许比较)和 Display trait(来启用打印)的 Pair 才会实现 cmp_display 方法 +impl Pair { + pub fn cmp_display(&self) { + if self.x >= self.y { + println!("The largest member is x = {}", self.x); + } else { + println!("The largest member is y = {}", self.y); + } + } +} + +pub fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { + if x.len() > y.len() { + x + } else { + y + } +} + +// struct Cacher +// where +// T: Fn(u32) -> u32, +// { +// calculation: T, +// value: Option, +// } +// +// impl Cacher +// where +// T: Fn(u32) -> u32, +// { +// fn new(calculation: T) -> Cacher { +// Self { +// calculation, +// value: None, +// } +// } +// +// fn value(&mut self, args: u32) -> u32 { +// match self.value { +// Some(&v) => v, +// None => { +// let v = (self.calculation)(args); +// v +// } +// } +// } +// } + +pub struct Cacher +where + T: Fn(&K) -> V, +{ + pub calculation: T, + pub value: HashMap, +} +use core::hash::Hash; +impl Cacher +where + V: Copy, + K: Hash + Eq, + T: Fn(&K) -> V, +{ + pub fn new(calculation: T) -> Cacher { + Self { + calculation, + value: HashMap::::new(), + } + } + + pub fn value(&mut self, args: K) -> V { + let value = &mut self.value; + + match value.get(&args) { + Some(&v) => v, + None => { + let x = (self.calculation)(&args); + let x1 = x.clone(); + value.insert(args, x); + x1 + } + } + + // match self.value.get(&args) { + // Some(&v) => v, + // None => { + // let x = (self.calculation)(&args); + // let x1 = x.clone(); + // self.value.insert(args, x); + // x1 + // } + // } + } +} + +#[derive(Debug)] +pub struct Shoe { + pub size: u32, + pub style: String, +} + +pub fn shoes_in_my_size(shoes: Vec, shoe_size: u32) -> Vec { + shoes + // .iter() // a collection of type `std::vec::Vec` cannot be built from `std::iter::Iterator` + .into_iter() //获取 vector 所有权的迭代器 + .filter(|s| s.size == shoe_size) + .collect() +} + +pub struct Counter { + count: u32, +} + +impl Counter { + pub fn new() -> Counter { + Counter { count: 0 } + } +} + +impl Iterator for Counter { + type Item = u32; + + fn next(&mut self) -> Option { + self.count += 1; + + if self.count < 6 { + Some(self.count) + } else { + None + } + } +} + +pub trait Messenger { + fn send(&self, msg: &str); +} + +pub struct LimitTracker<'a, T: Messenger> { + messenger: &'a T, + value: usize, + max: usize, +} + +impl<'a, T> LimitTracker<'a, T> +where + T: Messenger, +{ + pub fn new(messenger: &'a T, max: usize) -> LimitTracker { + LimitTracker { + messenger, + value: 0, + max, + } + } + + pub fn set_value(&mut self, value: usize) { + self.value = value; + + let percentage_of_max = self.value as f64 / self.max as f64; + + if percentage_of_max >= 1.0 { + self.messenger.send("Error: You are over your quota!"); + } else if percentage_of_max >= 0.9 { + self.messenger + .send("Urgent warning: You've used up over 90% of your quota!"); + } else if percentage_of_max >= 0.75 { + self.messenger + .send("Warning: You've used up over 75% of your quota!"); + } + } +} + +pub trait Pilot { + fn fly(&self); +} + +pub trait Wizard { + fn fly(&self); +} + +pub struct Human; + +impl Pilot for Human { + fn fly(&self) { + println!("This is your captain speaking."); + } +} + +impl Wizard for Human { + fn fly(&self) { + println!("Up!"); + } +} + +impl Human { + pub fn fly(&self) { + println!("*waving arms furiously*"); + } +} diff --git a/src/main.rs b/src/main.rs index d4f0b22..ec3ea67 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,12 +4,12 @@ mod tests; mod user; use std::cell::RefCell; -use std::hash::Hash; -use std::ops::Deref; use std::rc::{Rc, Weak}; use std::sync::{mpsc, Arc, Mutex}; use std::time::Duration; -use std::{collections::HashMap, fmt::Display, fs::File, io, io::ErrorKind, thread}; +use std::{collections::HashMap, fs::File, io::ErrorKind, thread}; + +use rust_study::*; fn main() { let mut s = String::from("Hello"); @@ -1084,561 +1084,3 @@ fn main() { // person.fly(); Human::fly(&person); } - -#[derive(Debug)] -struct Point1 { - x: T, - y: U, -} - -impl Point1 { - fn x(&self) -> &D { - &self.x - } -} - -impl Point1 { - fn y(&self) -> i32 { - self.y - } -} - -impl Point1 { - fn mixup(self, p: Point1) -> Point1 { - Point1 { x: self.x, y: p.y } - } -} - -fn test_tuple(t: (i32, &str)) { - println!("{} {}", t.0, t.1); -} - -static mut COUNTER: u32 = 0; - -fn add_to_count(inc: u32) { - unsafe { - COUNTER += inc; - } -} - -use core::fmt; -use std::fmt::Formatter; -use std::io::Read; - -#[derive(Debug)] -struct Bt { - height: u32, - label: Option, -} - -#[derive(Debug)] -struct SelectBox { - width: u32, - height: u32, - options: Vec, -} - -impl Draw for SelectBox { - fn draw(&self) { - // code to actually draw a select box - println!("{:?}", self); - } -} - -#[derive(Debug)] -pub struct Button { - pub width: u32, - pub height: u32, - pub label: String, -} - -impl Draw for Button { - fn draw(&self) { - // 实际绘制按钮的代码 - println!("{:?}", self); - } -} - -pub struct Screen { - pub components: Vec>, -} - -impl Screen { - pub fn run(&self) { - for component in self.components.iter() { - component.draw(); - } - } -} - -pub trait Draw { - fn draw(&self); -} - -struct MyBox(T); - -impl MyBox { - fn new(x: T) -> MyBox { - MyBox(x) - } -} - -impl Deref for MyBox { - type Target = T; - - fn deref(&self) -> &T { - &self.0 - } -} - -fn hello_str(name: &str) { - println!("Hello, {}!", name); -} - -#[derive(Debug)] -enum List { - Cons(i32, RefCell>), - Nil, -} - -impl List { - fn tail(&self) -> Option<&RefCell>> { - use crate::List::*; - match self { - Cons(_, item) => Some(item), - Nil => None, - } - } -} - -#[derive(Debug)] -struct Node { - value: i32, - parent: RefCell>, - children: RefCell>>, -} - -fn change(some_string: &mut String) { - some_string.push_str(", world"); -} - -//enum IpAddrKind { -// V4, -// V6, -//} - -#[derive(Debug)] -enum IpAddr { - V4(u8, u8, u8, u8), - V6(String), -} - -enum Color { - _Rgb(i32, i32, i32), - Hsv(i32, i32, i32), -} - -enum Msg { - _Quit, - ChangeColor(Color), -} - -// Quit 没有关联任何数据。 -// Move 包含一个匿名结构体。 -// Write 包含单独一个 String。 -// ChangeColor 包含三个 i32。 -#[derive(Debug)] -enum Message { - Quit, - Move { x: i32, y: i32 }, - Write(String), - ChangeColor(i32, i32, i32), -} - -impl Message { - fn call(&self) { - println!("this message call."); - } -} - -#[derive(Debug)] -struct Rectangle { - width: u32, - height: u32, -} - -impl Rectangle { - fn area(&self) -> u32 { - self.width * self.height - } - - fn can_hold(&self, other: &Rectangle) -> bool { - self.width > other.width && self.height > other.height - } - - fn square(size: u32) -> Rectangle { - Rectangle { - width: size, - height: size, - } - } -} - -mod sound { - pub mod instrument { - pub fn clarinet() { - println!("this clarinet"); - } - } -} - -mod performance_group { - pub use crate::sound::instrument; - - pub fn clarinet_trio() { - instrument::clarinet(); - instrument::clarinet(); - instrument::clarinet(); - } -} - -/// 传播错误 -fn read_username_from_file(path: &str) -> Result { - // 1. - // let f = File::open(path); - // - // let mut f = match f { - // Ok(file) => file, - // Err(error) => return Err(error), - // }; - // - // let mut s = String::new(); - // match f.read_to_string(&mut s) { - // Ok(_) => Ok(s), - // Err(e) => Err(e), - // } - - // 2. - let mut f = File::open(path)?; - - let mut s = String::new(); - f.read_to_string(&mut s)?; - Ok(s) - - // 3. - // let mut s = String::new(); - // File::open(path)?.read_to_string(&mut s)?; - // Ok(s) - - // 4. - // fs::read_to_string(path) -} - -trait Summary { - fn summarize_author(&self) -> String; - - fn summarize(&self) -> String { - format!("(Read more from {}...)", self.summarize_author()) - } -} - -#[derive(Debug)] -struct Tweet { - pub username: String, - pub content: String, - pub reply: bool, - pub retweet: bool, -} - -impl Summary for Tweet { - fn summarize_author(&self) -> String { - format!("@{}", self.username) - } -} - -// impl ToString for Tweet { -// fn to_string(&self) -> String { -// format!("{:?}", self) -// } -// } - -impl Display for Tweet { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!( - f, - "Tweet username: {}, content: {}", - self.username, self.content - ) - } -} - -//fn notify(t: &T, u: &U) -> String { -// format!("{}, {}", u.summarize(), t.to_string()) -//} - -//fn notify(t: &(impl Summary + ToString), u: &(impl Summary)) -> String { -// format!("{}, {}", u.summarize(), t.to_string()) -//} - -fn notify(t: &T, u: &U) -> String -where - T: Summary + ToString, - U: Summary, -{ - format!("{}, {}", u.summarize(), t.to_string()) -} - -// 返回实现了指定 trait 的方法 -fn returns_summarizable() -> impl Summary { - Tweet { - username: String::from("horse_ebooks"), - content: String::from("of course, as you probably already know, people"), - reply: false, - retweet: false, - } -} - -fn largest(list: &[T]) -> T { - //fn largest(list: &[impl PartialOrd + Copy]) -> impl PartialOrd + Copy { - //fn largest(list: &[T]) -> T - // where T: PartialOrd + Copy { - let mut largest = list[0]; - - for &item in list.iter() { - if item > largest { - largest = item; - } - } - - // for item in list.iter() { - // if *item > largest { - // largest = *item; - // } - // } - - return largest; -} - -fn largest2(list: &[T]) -> &T { - let mut largest = &list[0]; - - for item in list.iter() { - if item > largest { - largest = item; - } - } - - return largest; -} - -#[derive(Debug)] -struct Pair { - x: T, - y: T, -} - -impl Pair { - fn new(x: T, y: T) -> Self { - Self { x, y } - } -} - -// 只有那些为 T 类型实现了 PartialOrd trait(来允许比较)和 Display trait(来启用打印)的 Pair 才会实现 cmp_display 方法 -impl Pair { - fn cmp_display(&self) { - if self.x >= self.y { - println!("The largest member is x = {}", self.x); - } else { - println!("The largest member is y = {}", self.y); - } - } -} - -fn longest<'a>(x: &'a str, y: &'a str) -> &'a str { - if x.len() > y.len() { - x - } else { - y - } -} - -// struct Cacher -// where -// T: Fn(u32) -> u32, -// { -// calculation: T, -// value: Option, -// } -// -// impl Cacher -// where -// T: Fn(u32) -> u32, -// { -// fn new(calculation: T) -> Cacher { -// Self { -// calculation, -// value: None, -// } -// } -// -// fn value(&mut self, args: u32) -> u32 { -// match self.value { -// Some(&v) => v, -// None => { -// let v = (self.calculation)(args); -// v -// } -// } -// } -// } - -struct Cacher -where - T: Fn(&K) -> V, -{ - calculation: T, - value: HashMap, -} - -impl Cacher -where - V: Copy, - K: Hash + Eq, - T: Fn(&K) -> V, -{ - fn new(calculation: T) -> Cacher { - Self { - calculation, - value: HashMap::::new(), - } - } - - fn value(&mut self, args: K) -> V { - let value = &mut self.value; - - match value.get(&args) { - Some(&v) => v, - None => { - let x = (self.calculation)(&args); - let x1 = x.clone(); - value.insert(args, x); - x1 - } - } - - // match self.value.get(&args) { - // Some(&v) => v, - // None => { - // let x = (self.calculation)(&args); - // let x1 = x.clone(); - // self.value.insert(args, x); - // x1 - // } - // } - } -} - -#[derive(Debug)] -struct Shoe { - size: u32, - style: String, -} - -fn shoes_in_my_size(shoes: Vec, shoe_size: u32) -> Vec { - shoes - // .iter() // a collection of type `std::vec::Vec` cannot be built from `std::iter::Iterator` - .into_iter() //获取 vector 所有权的迭代器 - .filter(|s| s.size == shoe_size) - .collect() -} - -struct Counter { - count: u32, -} - -impl Counter { - fn new() -> Counter { - Counter { count: 0 } - } -} - -impl Iterator for Counter { - type Item = u32; - - fn next(&mut self) -> Option { - self.count += 1; - - if self.count < 6 { - Some(self.count) - } else { - None - } - } -} - -pub trait Messenger { - fn send(&self, msg: &str); -} - -pub struct LimitTracker<'a, T: Messenger> { - messenger: &'a T, - value: usize, - max: usize, -} - -impl<'a, T> LimitTracker<'a, T> -where - T: Messenger, -{ - pub fn new(messenger: &'a T, max: usize) -> LimitTracker { - LimitTracker { - messenger, - value: 0, - max, - } - } - - pub fn set_value(&mut self, value: usize) { - self.value = value; - - let percentage_of_max = self.value as f64 / self.max as f64; - - if percentage_of_max >= 1.0 { - self.messenger.send("Error: You are over your quota!"); - } else if percentage_of_max >= 0.9 { - self.messenger - .send("Urgent warning: You've used up over 90% of your quota!"); - } else if percentage_of_max >= 0.75 { - self.messenger - .send("Warning: You've used up over 75% of your quota!"); - } - } -} - -trait Pilot { - fn fly(&self); -} - -trait Wizard { - fn fly(&self); -} - -struct Human; - -impl Pilot for Human { - fn fly(&self) { - println!("This is your captain speaking."); - } -} - -impl Wizard for Human { - fn fly(&self) { - println!("Up!"); - } -} - -impl Human { - fn fly(&self) { - println!("*waving arms furiously*"); - } -}