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.

1.15.17. _lock

_lock()

Metamethods of class object only. Called when a class is locked (manually by an explicit call to cls.lock(), when the class is being inherited or when its instance is first created). this references the class object itself. At this stage the class still can be modified.