Object-Oriented Programming (OOP)

Rhai does not have objects per se, but it is possible to simulate object-oriented programming.

Use Object Maps to Simulate OOP

Rhai’s object maps has special support for OOP.

Rhai conceptMaps to OOP
Object mapsobjects
Object map properties holding valuesproperties
Object map properties that hold function pointersmethods

When a property of an object map is called like a method function, and if it happens to hold a valid function pointer (perhaps defined via an anonymous function), then the call will be dispatched to the actual function with this binding to the object map itself.

Use Anonymous Functions to Define Methods

Anonymous functions defined as values for object map properties take on a syntactic shape that resembles very closely that of class methods in an OOP language.

Anonymous functions can also capture variables from the defining environment, which is a very common OOP pattern. Capturing is accomplished via a feature called automatic currying and can be turned off via the no_closure feature.

Examples


#![allow(unused_variables)]
fn main() {
let factor = 1;

// Define the object
let obj =
     {
          data: 0,
          increment: |x| this.data += x,          // 'this' binds to 'obj'
          update: |x| this.data = x * factor,     // 'this' binds to 'obj', 'factor' is captured
          action: || print(this.data)             // 'this' binds to 'obj'
     };

// Use the object
obj.increment(1);
obj.action();                                     // prints 1

obj.update(42);
obj.action();                                     // prints 42

factor = 2;

obj.update(42);
obj.action();                                     // prints 84
}