From e43403a68eaae741b9331b5c08fbbb5328861941 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Sat, 12 May 2018 18:36:41 -0600 Subject: [PATCH] Updates for TR comments --- Chapter04/gadt.rs | 8 ++++---- Chapter04/lifetimes.rs | 28 ++++++++++++++++++++++++++++ Chapter04/parameters.rs | 3 +++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/Chapter04/gadt.rs b/Chapter04/gadt.rs index c7269eb..d126445 100644 --- a/Chapter04/gadt.rs +++ b/Chapter04/gadt.rs @@ -1,5 +1,5 @@ -type JSJIT = u64; +struct JSJIT(u64); enum JSJITorExpr { Jit { label: JSJIT }, @@ -18,7 +18,7 @@ fn jump(l: JSJIT) -> JSJITorExpr //jump to compiled code //this depends on implementation //so we will just leave this as a stub - JSJITorExpr::Jit { label: 0 } + JSJITorExpr::Jit { label: JSJIT(0) } } fn eval(e: JSJITorExpr) -> JSJITorExpr { @@ -36,14 +36,14 @@ fn eval(e: JSJITorExpr) -> JSJITorExpr let r = eval(*r); //call add op codes for possible l,r representations //should return wrapped value from above - JSJITorExpr::Jit { label: 0 } + JSJITorExpr::Jit { label: JSJIT(0) } } JSExpr::OperatorMul { lexpr: l, rexpr: r } => { let l = eval(*l); let r = eval(*r); //call mul op codes for possible l,r representations //should return wrapped value from above - JSJITorExpr::Jit { label: 0 } + JSJITorExpr::Jit { label: JSJIT(0) } } } } diff --git a/Chapter04/lifetimes.rs b/Chapter04/lifetimes.rs index 28423e0..05cfd57 100644 --- a/Chapter04/lifetimes.rs +++ b/Chapter04/lifetimes.rs @@ -15,10 +15,38 @@ impl<'a> Red for Ball<'a> { } static num: i32 = 5; +struct Context<'s>(&'s mut String); + +impl<'s> Context<'s> +{ + fn mutate<'c>(&mut self, cs: &'c mut String) -> &'c mut String + { + let swap_a = self.0.pop().unwrap(); + let swap_b = cs.pop().unwrap(); + self.0.push(swap_b); + cs.push(swap_a); + cs + } +} + fn main() { let x = 3; ground_lifetime(&x); let obj = Box::new(Ball { diameter: &num }) as Box; + + let mut s = "outside string context abc".to_string(); + { + //temporary context + let mut c = Context(&mut s); + { + //further temporary context + let mut s2 = "inside string context def".to_string(); + c.mutate(&mut s2); + println!("s2 {}", s2); + } + } + println!("s {}", s); + } diff --git a/Chapter04/parameters.rs b/Chapter04/parameters.rs index 7ece10c..5418fb2 100644 --- a/Chapter04/parameters.rs +++ b/Chapter04/parameters.rs @@ -56,4 +56,7 @@ fn main() ::f(&b); ::f(&b); + + f::(&b); + f::(&b); }