X-Git-Url: https://piware.de/gitweb/?p=learn-rust.git;a=blobdiff_plain;f=concepts%2Fsrc%2Fmain.rs;h=4b6df6447be9930e5773202f24601cd817722eb8;hp=65fb785c838a2a966e6c1d4c5494f4751d5f0b0d;hb=d6fbfabfaf434ae365854f0587547cff3ca78dae;hpb=cf171920f1d9768f922556b13042e3a3465483f3 diff --git a/concepts/src/main.rs b/concepts/src/main.rs index 65fb785..4b6df64 100644 --- a/concepts/src/main.rs +++ b/concepts/src/main.rs @@ -205,6 +205,7 @@ fn test_threads() { t1.join().unwrap(); + // message passing let (tx1, rx) = sync::mpsc::channel(); let tx2 = tx1.clone(); @@ -228,6 +229,58 @@ fn test_threads() { sender1.join().unwrap(); sender2.join().unwrap(); + + // shared state + let counter = sync::Arc::new(sync::Mutex::new(0)); + let mut threads = vec![]; + for _ in 0..10 { + let tc = sync::Arc::clone(&counter); + threads.push(thread::spawn(move || { + *tc.lock().unwrap() += 1; + })); + } + + for t in threads { + t.join().unwrap(); + } + + println!("counter: {}", *counter.lock().unwrap()); +} + +fn test_dyn_traits() { + let text = "I ate a salad for lunch today"; + let mut post = Post::new(); + post.add_text(text); + assert_eq!("", post.content()); + + post.request_review(); + assert_eq!("", post.content()); + + post.reject(); + assert_eq!("", post.content()); + + post.request_review(); + assert_eq!("", post.content()); + + post.approve(); // first + assert_eq!("", post.content()); + + post.approve(); // second + assert_eq!(text, post.content()); + + post.reject(); // no-op + assert_eq!(text, post.content()); +} + +fn test_state_types() { + let mut post = TPost::new(); + post.add_text("I ate a salad for lunch"); + let post = post.request_review(); + let mut post = post.reject(); + post.add_text(" today"); + let post = post.request_review(); + let post = post.approve(); + assert_eq!(post.content(), "I ate a salad for lunch today"); } fn main() { @@ -239,4 +292,6 @@ fn main() { test_closures(); test_iterators(); test_threads(); + test_dyn_traits(); + test_state_types(); }