You implement the Visitor Pattern in Rust without OOP by defining an enum for your data types and a trait for the visitor logic, then using match to dispatch behavior.
enum Expr {
Num(i32),
Add(Box<Expr>, Box<Expr>),
}
trait Visitor {
fn visit_num(&self, n: i32);
fn visit_add(&self, left: &Expr, right: &Expr);
}
impl Expr {
fn accept(&self, v: &dyn Visitor) {
match self {
Expr::Num(n) => v.visit_num(*n),
Expr::Add(l, r) => v.visit_add(l, r),
}
}
}
struct SumVisitor;
impl Visitor for SumVisitor {
fn visit_num(&self, n: i32) { println!("Num: {}", n); }
fn visit_add(&self, l: &Expr, r: &Expr) { println!("Add"); }
}