From 5d58a966825e9b165ffa5e3ea3c112c1387d42a3 Mon Sep 17 00:00:00 2001 From: osmannyildiz Date: Mon, 29 Apr 2024 14:42:55 +0300 Subject: [PATCH] day 2 (240428) --- src/main.rs | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 120 insertions(+), 3 deletions(-) diff --git a/src/main.rs b/src/main.rs index aeb3127..30aaa2f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,5 @@ +use std::thread; + fn main() { let i8_var_i8: u128 = 123; println!("Hello, {}!", i8_var_i8); @@ -46,7 +48,7 @@ fn main() { } let struct_var = StructName { - field1: 1, + field1: 42, field2: 5.757, }; @@ -181,6 +183,123 @@ fn main() { let mut return_var = function_print("Naber la"); return_var.push_str(" geldin mi?"); println!("{}", return_var); + println!("-----"); + + // Copy (fixed size) + let fs_var1 = 42; + let mut fs_var2 = fs_var1; + fs_var2 = 123; + println!("fs_var1: {}", fs_var1); + println!("fs_var2: {}", fs_var2); + println!("-----"); + + // Move (non-fixed size) + let nfs_var1 = "Değişken".to_string(); + let mut nfs_var2 = nfs_var1; + // At this moment, nfs_var1 has lost the ownership, so we can no longer use it + // println!("nfs_var1: {}", nfs_var1); // ERROR + println!("nfs_var2: {}", nfs_var2); + println!("-----"); + + // Clone (non-fixed size) + let mut nfs_var3 = nfs_var2.clone(); + nfs_var3.push_str(" Değişir"); + println!("nfs_var2: {}", nfs_var2); + println!("nfs_var3: {}", nfs_var3); + println!("-----"); + + // Immutable borrowing/shared reference (1:N) + let borrowing1 = &nfs_var2; + println!("nfs_var2: {}", nfs_var2); + println!("borrowing1: {}", borrowing1); + println!("-----"); + + // Mutable borrowing (1:1) + let borrowing2 = &mut nfs_var2; + // println!("nfs_var2: {}", nfs_var2); // This takes the reference back and ERROR + println!("borrowing2: {}", borrowing2); + // println!("nfs_var2: {}", nfs_var2); // This takes the reference back and ERROR + println!("borrowing2: {}", borrowing2); + println!("nfs_var2: {}", nfs_var2); // This takes the reference back + println!("-----"); + + // Traits + // OOP -> inject method + // Struct yapısını daha class gibi kullanmamıza olanak sağlar + // Idioms ~= best practices + + trait DenemeTrait { + fn default_method(&self) { + println!("== Default method =="); + } + + fn print_all(&self); + } + + impl DenemeTrait for StructName { + fn print_all(&self) { + println!("== field 1: {}, field 2: {} ==", self.field1, self.field2); + } + + fn default_method(&self) { + println!("== Default method override =="); + } + } + + struct_var.print_all(); + struct_var.default_method(); + + let student3 = Student { + name: "Yaşar".to_string(), + surname: String::from("Güzel"), + department: Department::ComputerEngineering(vec!["Unity".to_string()]), + score: 100, + }; + let student3 = Student { + name: "Yaşar".to_string(), + surname: String::from("Güzel"), + department: Department::ComputerEngineering(vec!["Unity".to_string()]), + score: 100, + }; + impl Student { + fn print_all(&self) { + println!("{} {}, notu {}.", self.name, self.surname, self.score); + } + } + let student4 = Student { + name: "Fatih".to_string(), + surname: "Ballı".to_string(), + department: Department::Science, + score: 99, + }; + student3.print_all(); + student4.print_all(); + + // Threads, concurrency, parallelism, channel + + let thread1 = thread::spawn(|| { + for i in 1..10 { + println!("Thread says: {}", i); + } + }); + println!("Thread start"); + // let result = thread1.join()?; + thread1.join().unwrap(); + println!("Thread end"); + + println!("Thread_local start"); + use std::cell::RefCell; + thread_local! { + pub static FOO: RefCell = RefCell::new(10); + } + FOO.with_borrow(|v| { + println!("Thread_local says: {}", v); + }); + println!("Thread_local end"); + + // Smart pointer, Box, RefCell, Rc, Arc + + drop(struct_var); } fn function_print(s: &str) -> String { @@ -188,5 +307,3 @@ fn function_print(s: &str) -> String { // return String::from(s); String::from(s) } - -// Tomorrow: trait, thread, canister