18. Refs (Mutable References)
A Ref is a mutable container for a value. Create with &, dereference with *, and assign with <-.
18.1 Creating and Using Refs
-- Create a ref with &
let x = &42;
*x println; -- 42 (dereference with *)
-- Mutate with <-
x <- 100;
*x println; -- 100
-- Works with any type
let s = &"hello";
s <- "world";
*s println; -- "world"
-- Explicit type annotation
let r Ref<Int> = &0;
-- Ref set returns the value
let v = (x <- 77);
v println; -- 77
18.2 Refs as Function Arguments
fn increment(r Ref<Int>) Int {
let old = *r;
r <- *r + 1;
old
}
let counter = &0;
counter increment println; -- 0
counter increment println; -- 1
*counter println; -- 2
18.3 Overloading <-
struct Accumulator { total Ref<Int>, count Ref<Int> }
fn <-(acc Accumulator, val Int) Int {
acc.total <- *(acc.total) + val;
acc.count <- *(acc.count) + 1;
val
}
let acc = Accumulator{&0, &0};
acc <- 10;
acc <- 20;
acc <- 30;
*(acc.total) println; -- 60
*(acc.count) println; -- 3