use std::fmt::{Display, Debug};
use std::io::{self, ErrorKind, Write, Read};
fn variable_test() {
let x = 5;
let x = "hello, world"; print!("x is {}\n", x);
}
fn typeofdata() {
let guess: u32 = "42".parse().expect("not a number");
print!("guess is {}\n", guess);
}
fn arra_y() {
let a = [3; 5];
let mut index = String::new();
io::stdin().read_line(&mut index).expect("Failed to read line");
let index: usize = index.trim().parse().expect("Index extered was not a number");
let element = a[index];
println!("value is {}", element)
}
fn add(x: i32, y: i32) -> i32 {
x + y
}
fn func() {
let x = add(4, 5);
println!("4 add 5 is {}", x);
}
fn judge(x: i32) {
let number = if x > 0 {1} else {0};
println!("number is {}", number);
}
fn cycle() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter >= 10 {
break counter * 2; }
};
println!("result is {}", result);
}
fn label() {
let mut i = 1;
'counting_up: loop { let mut j = 1;
loop {
if i >= 2 {
break 'counting_up;
}
if j > 9 {
break;
}
println!("{} * {} = {}", i, j, i * j);
j+=1;
}
i += 1;
}
}
fn use_while() {
let mut number = 3;
while number != 0 {
println!("{number}!");
number -= 1;
}
}
fn for_in() {
let arr = [3;4];
for (i, e) in arr.iter().enumerate() {
println!("the {}th element is {}", i, e);
}
for number in (1..4).rev() {
println!("{number}!");
}
}
fn get_ownership() -> String {
String::from("yours")
}
fn take_and_back(s: String) -> String {
s
}
fn ownership() {
let s1 = get_ownership();
let s2 = String::from("hello");
let s3 = take_and_back(s2);
println!("s1: {}", s1);
println!("s3: {}", s3);
}
fn reference() {
let mut s = String::from("hello, ");
change(&mut s);
println!("now s is: {}", s);
let r1 = &mut s;
r1.push_str("!");
println!("r1 is {}", r1);
s.push_str("~~");
println!("s is {}", s); }
fn change(s: &mut String) {
s.push_str("world");
}
fn slice() {
slice_str();
slice_num();
}
fn slice_num() {
let a = [1,2,3,4,5];
let slice: &[i32] = &a[1..3];
assert_eq!(slice, &[2,3]);
}
fn slice_str() {
let s = String::from("hello world");
let hello = &s[0..5];
let world: &str = &s[6..];
println!("{}, {}", hello, world);
let first = first_word(&s);
println!("first word is `{}`", first);
}
fn first_word(s: &str) -> &str { let bytes = s.as_bytes();
for (i, &c) in bytes.iter().enumerate() {
if c == b' ' {
return &s[..i];
}
}
&s[..]
}
#[derive(Debug)]
struct User {
active: bool,
name: String,
email: String,
}
fn structure() {
let mut user = User {
active: true,
name: String::from("dawson"),
email: String::from("957360688@qq.com"), };
user.email = String::from("jeedq@qq.com");
println!("email: {}", user.email); let two = build_user(user.name, user.active);
let three = User {
name: String::from("nera"),
..user };
println!("user: {:?}", two)
}
fn build_user(name: String, active: bool) -> User {
User { active, name, email:String::from("xxx@qq.com") } }
fn tuple_struct() {
struct Color(i32, i32, i32);
let klein_blue = Color(0, 47, 167);
println!("klein bule is R: {}, G: {}, B: {}", klein_blue.0, klein_blue.1, klein_blue.2);
}
fn method() {
let rec = Rectangle {
width: 4,
height: 5
};
println!("area is {}", rec.area());
println!("new a square.");
let squ = Rectangle::square(5);
println!("square's ares is {}", squ.area())
}
fn struct_simple() {
let rec = Rectangle {
width: 3,
height: 4,
};
println!("area: {}", area(rec));
let x = 3;
let y = back(x);
println!("x: {}", x);
}
fn area(rec: Rectangle) -> u32 {
rec.width * rec.height
}
fn back(x: u32) -> u32 {
x
}
enum Message {
Quit,
Move { x: i32, y: i32 },
Write(String),
ChangeColor(i32, i32, i32),
}
impl Message {
fn call(&self) -> &str {
let x = match self {
Message::Quit => "quit",
Message::Move{x, y} => "move",
Message::Write(str) => str,
_ => "other"
};
x
}
}
fn enumerate() {
let m = Message::Write(String::from("hello"));
let str = m.call();
println!("message call is {}", str);
}
fn if_let() {
let some_num = Some(2);
let x = if let Some(i) = some_num {
i
} else { 0
};
}
fn module() {
}
fn vector() {
let mut v = vec![1,2,3];
let first = &v[0];
v.push(4);
let last = v.pop();
match last {
Some(i) => println!("last is {}", i),
None => println!("vector empty"),
};
for i in &mut v {
*i += 50;
}
println!("vector now {:?}", v);
}
fn string() {
let mut s1 = String::from("foo");
let temp = "bar";
s1.push_str(temp);
println!("temp can use: {}", temp);
let mut s2 = String::from("lo");
s2.push('l');
let s3 = s1 + &s2;
println!("s3: {}", s3);
let s4 = format!("{}-{}", s2, s3);
println!("s4: {}", s4);
let hello = "Здравствуйте".to_string();
let ans = &hello[0..2];
for c in hello.chars() {
print!("{} ", c);
}
println!();
for b in hello.bytes() {
print!("{} ", b);
}
println!();
}
use std::collections::HashMap;
fn 哈希() {
let mut scores: HashMap<String, usize> = HashMap::new();
scores.insert(String::from("Blue"), 10);
scores.entry("Yellow".to_string()).or_insert(50);
let value = scores.get("Blue");
for (key, value) in &scores {
println!("{}: {}", key, value); }
let teams = vec![String::from("Blue"), String::from("Yellow")];
let initial_scores = vec![10, 50];
let mut score: HashMap<_, _> = teams.into_iter().zip(initial_scores.into_iter()).collect();
let text = "hello world wonderful world";
let mut map = HashMap::new();
for word in text.split_whitespace() {
let count = map.entry(word).or_insert(0);
*count += 1;
}
println!("map: {:?}", map);
}
use std::fs::{File, OpenOptions};
use std::thread;
use std::time::Duration;
use fust_tutorials::{Tweet, Summary, Rectangle};
fn error_handle() {
let file = "hello.txt";
let mut f = match OpenOptions::new().read(true).write(true).open(file) {
Ok(file) => file,
Err(error) => match error.kind() {
ErrorKind::NotFound => match File::create(file) {
Ok(fc) => fc,
Err(e) => panic!("creat file failed: {}", e),
}
other_error => panic!("open file: {}", other_error),
}
};
let text = "hello, world".as_bytes();
match f.write(text) {
Ok(num) => println!("write {} bytes to {}", num, file),
Err(e) => panic!("error write: {}", e)
};
}
fn error_handle_with_wrap_helper(file: &str) -> Result<String, io::Error> {
let mut f = File::open("file").unwrap_or_else(|error | {
if error.kind() == ErrorKind::NotFound {
File::create(file).expect("Failed to create file")
} else {
panic!("Problel opening file: {:?}", error);
}
});
let mut s = String::new();
let num = f.read_to_string(&mut s)?;
println!("read {} bytes to buf", num);
Ok(s)
}
fn error_handle_with_wrap() {
let file = "hello.txt";
let mut s = error_handle_with_wrap_helper(file).unwrap();
s.push_str("...");
println!("the {}'s content is:", file);
println!("{}", s);
}
fn largest<T: std::cmp::PartialOrd + Copy>(list: &[T]) -> T {
let mut ret: T = list[0];
for &ele in list {
if ele > ret {
ret = ele;
}
}
ret
}
fn generic_type() {
let numbers = vec![4,6,9,2,4,7];
let ret = largest(&numbers);
println!("the largest is {}", ret);
}
fn impl_trait() {
let tweet = Tweet {
author: "dawson".to_string(),
content: "dawson is a good boy".to_string(),
reply_number: 255,
can_retweet: false
};
notify(&tweet);
}
fn notify(tweet: &impl Summary) {
println!("{}", tweet.summarize());
}
fn some_func<T, U>(t: &T, u: &U) -> i32
where T: Display + Clone,
U: Clone + Debug
{
1
}
struct Excerpt<'a> {
part: &'a str,
}
fn lifetime() {
let novel = String::from("Call me Dawson. some years ago...");
let first_sentence = novel.split('.').next().expect("Cound not find a '.'");
let excerpt = Excerpt {
part: first_sentence
};
}
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
fn compare<'a, T>(x: &'a str, y: &'a str, conn: T) -> &'a str
where T: Display
{
println!("display: {}", conn);
if x.len() > y.len() {
x
} else {
y
}
}
fn simple() {
let x = String::from("hello, world!");
let y = String::from("Dawson Jones");
let conn = "I'm the king of the world";
println!("the longer: {}", compare(&x, &y, conn));
}
use std::hash::Hash;
struct Cacher<T, U>
where T: Fn(U) -> U,
U: Hash + Eq,
{
calculation: T,
value: HashMap<U, U>,
}
impl<T, U> Cacher<T, U>
where T: Fn(U) -> U,
U: Hash + Eq + Copy,
{
fn new(calculation: T) -> Self {
Cacher { calculation, value: HashMap::new() }
}
fn get_value(&mut self, arg: U) -> U {
match self.value.get(&arg) {
Some(v) => *v,
None => {
let v= (self.calculation)(arg);
self.value.insert(arg, v);
v
}
}
}
}
fn generate_workout(intensity: u32, random_number: u32) {
let mut expensive_result = Cacher::new(|num| {
println!("calculating slowly...");
thread::sleep(Duration::from_secs(2));
num
});
if intensity < 25 {
println!("Today, do {} pushups!", expensive_result.get_value(intensity));
println!("Next, do {} situps!", expensive_result.get_value(intensity));
} else {
if random_number == 3 {
println!("Take a break today! Remember to stay hydrated!");
} else {
println!(
"Today, run for {} minutes!",
expensive_result.get_value(intensity)
);
}
}
}
fn closure() {
let simulated_user_specified_value = 10;
let simulated_random_number = 7;
println!("----start----");
generate_workout(simulated_user_specified_value, simulated_random_number);
println!("----end----");
}
fn iterator() {
let shoe = vec![6, 7, 8];
let filter: Vec<i32> = shoe.into_iter().filter(|size| size % 2 == 0).collect();
for ele in filter.iter() {
println!("{}", ele);
}
}
struct Counter {
start: u32,
end: u32,
}
fn range(start: u32, end: u32) -> Counter {
Counter { start, end }
}
impl Iterator for Counter {
type Item = u32;
fn next(&mut self) -> Option<Self::Item> {
if self.start < self.end {
self.start += 1;
Some(self.start - 1)
} else {
None
}
}
}
fn imple_iterator() {
for ele in range(1, 5) {
print!("{} ", ele);
}
println!();
}
fn main() {
variable_test();
func();
judge(-2);
cycle();
for_in();
ownership();
reference();
slice();
structure();
tuple_struct();
struct_simple();
method();
enumerate();
if_let();
vector();
string();
哈希();
error_handle();
generic_type();
impl_trait();
lifetime();
simple();
iterator();
imple_iterator();
fust_tutorials::add_two(5);
}