fn ownership_basics() {
let s1 = String::from("hello");
let s2 = s1;
println!("{}", s2);
let x = 5;
let y = x;
println!("x = {}, y = {}", x, y);
}
fn borrowing_examples() {
let mut s = String::from("hello");
let r1 = &s;
let r2 = &s;
println!("{} and {}", r1, r2);
let r3 = &mut s;
r3.push_str(" world");
println!("{}", r3);
}
fn lifetimes_demo<'a>() {
let s1 = String::from("long string");
{
let s2 = String::from("xyz");
let result = longest(&s1, &s2);
println!("Longest: {}", result);
}
}
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() { x } else { y }
}
fn move_semantics() {
let data = vec![1, 2, 3, 4, 5];
let doubled: Vec<i32> = data.into_iter()
.map(|x| x * 2)
.collect();
println!("Doubled: {:?}", doubled);
}
fn clone_example() {
let s1 = String::from("hello");
let s2 = s1.clone();
println!("s1 = {}, s2 = {}", s1, s2);
}
fn reference_counting() {
use std::rc::Rc;
let data = Rc::new(String::from("shared data"));
let data2 = Rc::clone(&data);
let data3 = Rc::clone(&data);
println!("Reference count: {}", Rc::strong_count(&data));
println!("Data: {}, {}, {}", data, data2, data3);
}
fn atomic_reference() {
use std::sync::Arc;
use std::thread;
let data = Arc::new(String::from("thread-safe data"));
let data2 = Arc::clone(&data);
let handle = thread::spawn(move || {
println!("In thread: {}", data2);
});
println!("In main: {}", data);
handle.join().unwrap();
}
fn slice_examples() {
let s = String::from("hello world");
let hello = &s[0..5];
let world = &s[6..11];
println!("hello: {}, world: {}", hello, world);
let a = [1, 2, 3, 4, 5];
let slice = &a[1..3];
println!("Array slice: {:?}", slice);
}
fn box_smart_pointer() {
let b = Box::new(5);
println!("Box value: {}", b);
let list = Box::new(Cons(1, Box::new(Cons(2, Box::new(Cons(3, Box::new(Nil)))))));
println!("List created");
}
enum List {
Cons(i32, Box<List>),
Nil,
}
fn deref_trait() {
let x = 5;
let y = &x;
assert_eq!(5, x);
assert_eq!(5, *y);
}
fn main() {
ownership_basics();
borrowing_examples();
lifetimes_demo();
move_semantics();
clone_example();
reference_counting();
atomic_reference();
slice_examples();
box_smart_pointer();
deref_trait();
}