How to Implement the Visitor Pattern Without OOP in Rust

Implement the Visitor Pattern in Rust by defining an enum for data, a trait for visitor logic, and a match statement to dispatch operations.

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"); }
}