1.15. Metamethods

Metamethods are a mechanism that allows the customization of certain aspects of the language semantics. Those methods are normal functions placed in a class declaration; It is possible to change many aspects of a table/class instance behavior by just defining a metamethod.

For example when we use relational operators other than ‘==’ on 2 instances, the VM will check if the class has a method in his parent called ‘_cmp’; if so it will call it to determine the relation between the objects.:

class Comparable {
    constructor(n)
    {
        name = n;
    }
    function _cmp(other)
    {
        if(name<other.name) return -1;
        if(name>other.name) return 1;
        return 0;
    }
    name = null;
}

let a = Comparable("Alberto");
let b = Comparable("Wouter");

if(a>b)
    print("a>b")
else
    print("b<=a");

1.15.1. _set

_set(idx,val)

invoked when the index idx is not present in the object or in its delegate chain. _set must ‘throw null’ to notify that a key wasn’t found but the there were not runtime errors (clean failure). This allows the program to differentiate between a runtime error and a ‘index not found’.

1.15.2. _get

_get(idx)

invoked when the index idx is not present in the object or in its delegate chain. _get must ‘throw null’ to notify that a key wasn’t found but the there were not runtime errors (clean failure). This allows the program to differentiate between a runtime error and a ‘index not found’.

1.15.3. _newslot

_newslot(key,value)

invoked when a script tries to add a new slot in a table.

if the slot already exists in the target table the method will not be invoked also if the “new slot” operator is used.

1.15.4. _delslot

_delslot(key)

invoked when a script deletes a slot from a table. if the method is invoked quirrel will not try to delete the slot himself

1.15.5. _add

_add(other)

the + operator

returns this + other

1.15.6. _sub

_sub(other)

the - operator (like _add)

1.15.7. _mul

_mul(other)

the * operator (like _add)

1.15.8. _div

_div(other)

the / operator (like _add)

1.15.9. _modulo

_modulo(other)

the % operator (like _add)

1.15.10. _unm

_unm()

the unary minus operator

1.15.11. _typeof

_typeof()

invoked by the typeof operator on tables, userdata, and class instances.

Returns the type of this as string

1.15.12. _cmp

_cmp(other)

invoked to emulate the < > <= >= and <=> operators

returns an integer as follow:

returns

relationship

> 0

if this > other

0

if this == other

< 0

if this < other

1.15.13. _call

_call(other)

invoked when a table, userdata, or class instance is called

1.15.14. _cloned

_cloned(original)

invoked when a table or class instance is cloned(in the cloned table)

1.15.15. _nexti

_nexti(previdx)

invoked when a userdata or class instance is iterated by a foreach loop.

If previdx==null it means that it is the first iteration. The function has to return the index of the ‘next’ value.

1.15.16. _tostring

_tostring()

Invoked when during string concatenation or when the print function prints a table, instance, or userdata. The method is also invoked by the sq_tostring() API.

Must return a string representation of the object.