summaryrefslogtreecommitdiff
path: root/rust/refs_and_borrows/src
diff options
context:
space:
mode:
authorCarlos Maiolino <[email protected]>2025-07-10 22:24:20 +0200
committerCarlos Maiolino <[email protected]>2025-07-10 22:24:20 +0200
commit869e68986aa8f69af6e7842260a68d1e5c6f796f (patch)
tree63b6b5ffc3d19414233d4629a533c0d9bf3cbf72 /rust/refs_and_borrows/src
parent20834dcc57537cd95260a4a22f5d91a027adfd35 (diff)
Add a bunch of code
Signed-off-by: Carlos Maiolino <[email protected]>
Diffstat (limited to 'rust/refs_and_borrows/src')
-rw-r--r--rust/refs_and_borrows/src/main.rs62
1 files changed, 62 insertions, 0 deletions
diff --git a/rust/refs_and_borrows/src/main.rs b/rust/refs_and_borrows/src/main.rs
new file mode 100644
index 0000000..212372b
--- /dev/null
+++ b/rust/refs_and_borrows/src/main.rs
@@ -0,0 +1,62 @@
+fn main() {
+ let m1 = String::from("Hello");
+ let m2 = String::from("world");
+
+ // Borrow m1 and m2 references to greet(), instead of passing ownership
+ greet(&m1, &m2);
+ let s = format!("{} {}", m1, m2);
+ println!("{s}");
+
+// fing_it();
+// aliasing_bonanza();
+// mutable_bonanza();
+ flow_me();
+}
+
+// g1 is a reference that points to m1 on the stack, and m1 is a String
+// containing a box, pointing to "Hello" string on the heap.
+fn greet(g1: &String, g2: &String) -> () {
+ println!("Greet: {}, {}", *g1, *g2);
+}
+
+fn fing_it() -> () {
+ let mut x: Box<i32> = Box::new(1);
+ let _a:i32 = *x;
+ *x += 1;
+
+ let ref1: Box<i32> = Box::new(-5);
+
+ println!("This is sparta: {}", i32::abs(*ref1));
+}
+
+/*
+fn aliasing_bonanza() -> () {
+ let mut v: Vec<i32> = vec![10, 20, 30];
+ let num: &i32 = &v[2];
+ v.push(40);
+
+ println!("{:?}", *num)
+}
+*/
+fn mutable_bonanza() -> () {
+ let mut v: Vec<i32> = vec![10, 20, 30];
+
+ // let mut <var> makes the VAR <var> mutable, i.e. it can be reassigned
+ // let <var>:&mut i32 = &mut foo creates an IMMUTABLE <var> that points to a
+ // mutable memory
+
+ let num: &mut i32 = &mut v[2];
+ let num2: &i32 = num;
+
+ println!("Index 2 == {}", *num2);
+}
+
+// Yes, moving { to the next line on purpose
+fn flow_me(strings: &Vec<String>, default: &String) -> &String
+{
+ if strings.len() > 0 {
+ &strings[0]
+ } else {
+ default
+ }
+}