rhai/doc/src/patterns/oop.md
2020-09-19 12:14:02 +08:00

2.1 KiB

Object-Oriented Programming (OOP)

{{#include ../links.md}}

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 concept Maps to OOP
[Object maps] objects
[Object map] properties holding values properties
[Object map] properties that hold [function pointers] methods

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] or more commonly as a [closure]), then the call will be dispatched to the actual function with this binding to the [object map] itself.

Use Closures to Define Methods

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

Closures also [capture][automatic currying] 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

let factor = 1;

// Define the object
let obj = #{
        data: 0,                             // object field
        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