-
Notifications
You must be signed in to change notification settings - Fork 24
Metamethods
Metamethods are functions that are called when performing operations on objects. They are used to implement operator overloading but cannot override default behavior.
Metamethods are usually called on the left-most value of the operation and will pass all relevant values to the handler (x
, y
, z
in the chart).
The metamethods marked with an asterisk (*
) can be called on either x
or y
. If you need to know which value it was called on, a third parameter (isRight
) will be set to false
if it's x
or true
if it's y
.
Note: Metamethods should not be called directly. They will not work properly when the object has this
values enabled. They might also need to run in a different state.
Metamethods can be set for an object by setting special indexes to the function you want it to call.
const endl = {};
const cout = {
__lshift: fun (left, right, isRight) {
if (right == endl)
printLn();
else
print(right);
return left;
}
};
cout << "hello " << "world" << endl;
Name | Operation | Called when... |
---|---|---|
__get |
x.y , x[y]
|
attempting to get a value that does not exist in the object |
__set |
x.y = z , x[y] = z
|
attempting to set a value that does not exist in the object |
__call |
x(...y) |
attempting to call the object |
__eq |
x == y |
checking if the object is equal to another value |
__gt |
x > y |
checking if the object is greater than another value, other operations are combinations of __eq and __gt
|
__in |
x in y |
|
__add * |
x + y |
|
__sub * |
x - y |
|
__mul * |
x * y |
|
__div * |
x / y |
|
__mod * |
x % y |
|
__pow * |
x ** y |
|
__neg |
-x |
|
__and * |
x & y |
|
__or * |
`x | y` |
__xor * |
x ^ y |
|
__lshift * |
x << y |
|
__rshift * |
x >> y |
|
__not |
~x |
|
__number |
n/a | implicitly converting the object to a number (passes instance) |
__bool |
n/a | implciitly converting the object to a bool (passes instance) |
__string |
n/a | implicitly or explicitly converting the object to a string (passes instance) |
__serialize |
n/a | the object is being serialized, does not need to return a string (passes instance) |