Qore Programming Language Reference Manual
 All Classes Namespaces Functions Variables Groups Pages

References allow for addressing other lvalues, including complex lvalue expressions, with an alias called a reference. References to lvalues are defined by placing a "\" character in front of an expression that gives an lvalue, such as in the following examples:

1 reference r1 = \a;
2 reference r2 = \recs[rn].order[on];

References are especially convenient when aliasing an internal part of a complex data structure. Consider the following example (a list of records, where each record is a hash with a list of orders under the "order" key - in the following example, we want to set the last record's last order's "numberofitems" key to be equal to the number of elements under the order's "items" key):

1 recs[recs.size() - 1].order[recs[recs.size() - 1].order.size() - 1].numberofitems = recs[recs.size() - 1].order[recs[recs.size() - 1].order.size() - 1].items.size();

In the above code, using references could greatly simplify the readability of the code:

1 reference lastrec = \recs[recs.size() - 1];
2 reference lastorder = \lastrec.order[lastrec.order.size() - 1];
3 lastorder.numberofitems = lastorder.items.size();
Local variables that are referenced are automatically converted to a special type of local variable that is protected by a mutual-exclusion thread lock so that the reference can be safely used in background threads. The lvalue represented by the local variable will exist beyond its local scope; as long as the reference to the lvalue exists, the local variable's lvalue will exist and remain valid.
Qore 0.8.5 universal lvalue references are supported; previously references could only be used with arguments to a function or method call or the like. As of Qore 0.8.5+, references can be used anywhere in Qore in any expression, even with references to local variables in background expressions and in closure argument lists.